我正在使用C++和GLSL 410中的OpenGL 4.5。
最近我遇到了一个问题,我试图在没有使用
使用该程序绘制的三角形全为黑色,与我预期的结果不同。经过一些尝试,我意识到在设置统一变量之前需要使用该程序。
绘制结果呈现正确颜色的三角形。
我的问题是为什么我需要先启动程序?我知道OpenGL作为状态机,但在这种情况下,为什么当前着色器程序状态是必要的?毕竟,我明确将着色器程序索引作为参数传递给
我希望这个答案能帮助我更好地理解OpenGL中的状态以及GPU中表示着色器程序的内存块是如何被利用或管理的。
最近我遇到了一个问题,我试图在没有使用
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作为状态机,但在这种情况下,为什么当前着色器程序状态是必要的?毕竟,我明确将着色器程序索引作为参数传递给
glGetUniformLocation
以获取input_color
的内存索引。我希望这个答案能帮助我更好地理解OpenGL中的状态以及GPU中表示着色器程序的内存块是如何被利用或管理的。