GLSL 子例程未更改
GLSL subroutine is not changed
我已经开始学习GLSL和OpenGL。现在我正在尝试查看 GLSL 子例程的工作原理,所以我在这里有我的片段着色器:
#version 330 core
out vec4 color;
subroutine vec4 ColorFunc();
subroutine (ColorFunc) vec4 colorBlue() {
return vec4(0.0, 0.0, 1.0, 1.0);
}
subroutine (ColorFunc) vec4 colorGreen() {
return vec4(0.0, 1.0, 0.0, 1.0);
}
subroutine uniform ColorFunc ColorSelector;
void main() {
color = ColorSelector();
}
在我加载的应用程序源代码中,编译着色器链接并在开始时启动程序。将创建一个三角形,顶点着色器不会执行任何特殊操作。显示函数(发送给glutDisplayFunc
的函数(如下所示:
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(TriangleVAO);
glDrawArrays(GL_TRIANGLES, 0, NumVertices);
GLint ColorSelectorLoc;
GLuint colorBlueIndex;
GLuint colorGreenIndex;
ColorSelectorLoc = glGetSubroutineUniformLocation(program, GL_FRAGMENT_SHADER, "ColorSelector");
if (ColorSelectorLoc < 0)
{
fprintf(stderr, "Error: ColorSelector is not an active subroutine uniform in the shadern");
exit(EXIT_FAILURE);
}
colorBlueIndex = glGetSubroutineIndex(program, GL_FRAGMENT_SHADER, "colorBlue");
colorGreenIndex = glGetSubroutineIndex(program, GL_FRAGMENT_SHADER, "colorGreen");
GLsizei n;
glGetProgramStageiv(program, GL_FRAGMENT_SHADER, GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS, &n);
GLuint *indices = new GLuint[n];
cout << "colorGreen: " << colorBlueIndex;
indices[ColorSelectorLoc] = colorGreenIndex;
glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, n, indices);
delete [] indices;
glFlush();
}
我期望三角形是绿色的,但它们始终是蓝色的,无论正确检索的ColorSelector
的值如何(其值为 0(。 colorBlueIndex
为 0,colorGreenIndex
为 1。我不知道我错过了什么。
glUniformSubroutinesuiv
调用期望n
等于活动子例程位置的数量
你可以通过以下方式获得这个:
glGetProgramStage(program, GL_FRAGMENT_SHADER, GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS, &n);
查看维基
我发现了问题。子例程的代码必须在 glDrawArray 之前:
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
GLint ColorSelectorLoc;
GLuint colorBlueIndex;
GLuint colorGreenIndex;
ColorSelectorLoc = glGetSubroutineUniformLocation(program, GL_FRAGMENT_SHADER, "ColorSelector");
if (ColorSelectorLoc < 0)
{
fprintf(stderr, "Error: ColorSelector is not an active subroutine uniform in the shadern");
exit(EXIT_FAILURE);
}
colorBlueIndex = glGetSubroutineIndex(program, GL_FRAGMENT_SHADER, "colorBlue");
colorGreenIndex = glGetSubroutineIndex(program, GL_FRAGMENT_SHADER, "colorGreen");
GLsizei n;
glGetProgramStageiv(program, GL_FRAGMENT_SHADER, GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS, &n);
GLuint *indices = new GLuint[n];
cout << "colorGreen: " << colorBlueIndex;
indices[ColorSelectorLoc] = colorGreenIndex;
glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, n, indices);
delete [] indices;
glBindVertexArray(TriangleVAO);
glDrawArrays(GL_TRIANGLES, 0, NumVertices);
glFlush();
}
相关文章:
- 子例程,不使用 pow,并带有参数和返回
- 如何将C++子例程链接到 x86 程序集程序?
- 调用子例程时类型不匹配
- 将分配给C++数组传递给 Fortran 子例程
- Android Studio 3.1.2 - 无法运行C++子例程"No implementation found for Java.lang.String..."
- 试图在C 中调用Fortran子例程
- Visual MSVC C 调用GFORTRAN子例程
- 从C 调用Fortran子例程会产生非法参数值
- 将类对象指针传递给默认构造函数(C 子例程)
- 如何从子例程函数获取到 main 函数的返回值
- 确定未在 Fortran 子例程顶部声明的变量类型
- 子例程在 MIPS 上调用了两次
- 从 C++ 调用 Fortran 子例程
- 将C++函数指针传递到Fortran子例程
- 如何使用传递到当前子例程中的参数调用不同的子例程(用于递归)
- 在主程序或函数子例程中使用数组的差异
- 如何将 fortran 子例程链接到 cpp 主程序
- 将C++数组传递给Fortran子例程会导致nan值出现在结果中
- 单元测试不会失败,但挂在子例程调用上
- GLSL 子例程未更改