为什么我必须先"use"着色器程序才能设置其制服?



我在C 和GLSL 410中使用openGL 4.5。

我最近遇到了一个问题,我试图在不首先使用glUseProgram使用着色器程序的情况下设置着着色器程序的统一变量。我有一个碎片着色器,带有一个均匀变量,称为input_color(我将将输出颜色设置为shader_program)。请注意i do 在绘制所有应该使用的内容之前,请在我的主拉动循环中调用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(),它需要您要修改的程序对象。

相关内容

  • 没有找到相关文章

最新更新