A. *_*led 3 c++ opengl fragment-shader
我正在关注 OpenGL v3.3 教程,该教程指导我使用glUniform4f修改片段着色器中的统一属性(请参阅下面的代码)。据我了解,OpenGL是一个状态机,我们不解除绑定当前shaderProgram被使用,我们宁可修改赋予给该程序的着色器的一个属性,那么为什么我们需要调用glUseProgram每一帧?
我知道对于更高版本的 OpenGL,情况并非如此,但我仍然想了解为什么 v3.3 会出现这种情况
OpenGL程序:
while (!glfwWindowShouldClose(window))
{
processInput(window);
glClearColor(0.2f, 1.0f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram); // the function in question
float redValue = (sin(glfwGetTime()) / 2.0f) + 0.5f;
int colorUniformLocation = glGetUniformLocation(shaderProgram, "ourColor");
glUniform4f(colorUniformLocation, redValue, 0.0f, 0.0f, 1.0f);
std::cout << colorUniformLocation << std::endl;
glBindVertexArray(VAO[0]);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(VAO[1]);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
}
Run Code Online (Sandbox Code Playgroud)
片段着色器
#version 330 core
out vec4 FragColor;
uniform vec4 ourColor;
void main()
{
FragColor = ourColor;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我忘了指出 glUniform4f 每帧设置一个新颜色(以周期性方式),代码的最终输出是 2 个带有动画颜色的三角形,从 while 循环中删除 glUseProgram 同时导致静态图像,这是'不是代码的预期目标。
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |