在我可以设置制服之前,为什么我必须“使用”着色器程序?

时间:2017-02-21 01:59:38

标签: opengl glsl opengl-4

我在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上着色器程序的内存块。

1 个答案:

答案 0 :(得分:4)

你不必。 GL 4.1及更高版本为您提供glProgramUniform(),它将获取您要修改的程序对象。