为什么我必须 "use" 一个着色器程序才能设置它的制服?
Why must I "use" a shader program before I can set its uniforms?
我在 C++ 和 GLSL 410 中使用 OpenGL 4.5。
我最近遇到了一个问题,我在尝试设置着色器程序的统一变量时没有先使用带有 glUseProgram
的着色器程序。我有一个片段着色器,它带有一个名为 input_color
的统一变量(一个我将输出颜色设置为的 vec4)附加到我的 shader_program
。请注意我做在我的主绘制循环中调用glUseProgram(shader_program)
然后绘制任何应该使用它的东西。
// set uniforms
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
用这个程序画的三角形全黑了,不是我期待的结果。经过一些试验,我意识到我需要在设置制服之前使用该程序。
// set uniforms
glUseProgram(shader_program); // my change
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
绘制出正确颜色的三角形。
我的问题是为什么我需要先开始使用该程序?我知道 OpenGL 作为 状态机 工作,但在这种情况下为什么需要当前着色器程序状态?毕竟,我明确地将shader_program
索引作为参数传递给glGetUniformLocation
以获得input_color
的内存索引。
我希望这个问题的答案能帮助我更好地理解 OpenGL 中的状态,以及如何利用或管理 GPU 上代表着色器程序的内存块。
您不必这样做。 GL 4.1 及更高版本为您提供 glProgramUniform()
,它采用您要修改的程序对象。
我在 C++ 和 GLSL 410 中使用 OpenGL 4.5。
我最近遇到了一个问题,我在尝试设置着色器程序的统一变量时没有先使用带有 glUseProgram
的着色器程序。我有一个片段着色器,它带有一个名为 input_color
的统一变量(一个我将输出颜色设置为的 vec4)附加到我的 shader_program
。请注意我做在我的主绘制循环中调用glUseProgram(shader_program)
然后绘制任何应该使用它的东西。
// set uniforms
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
用这个程序画的三角形全黑了,不是我期待的结果。经过一些试验,我意识到我需要在设置制服之前使用该程序。
// set uniforms
glUseProgram(shader_program); // my change
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
绘制出正确颜色的三角形。
我的问题是为什么我需要先开始使用该程序?我知道 OpenGL 作为 状态机 工作,但在这种情况下为什么需要当前着色器程序状态?毕竟,我明确地将shader_program
索引作为参数传递给glGetUniformLocation
以获得input_color
的内存索引。
我希望这个问题的答案能帮助我更好地理解 OpenGL 中的状态,以及如何利用或管理 GPU 上代表着色器程序的内存块。
您不必这样做。 GL 4.1 及更高版本为您提供 glProgramUniform()
,它采用您要修改的程序对象。