c++ - 为什么 glUseProgram 用 glUniform 调用每一帧?
问题描述
我正在关注 OpenGL v3.3 教程,该教程指示我使用glUniform4f修改片段着色器中的统一属性(请参阅下面的代码)。据我了解,OpenGL 是一个状态机,我们不会取消绑定当前正在使用的着色器程序,而是修改附加到程序的着色器中的一个属性,那么为什么我们需要在每一帧上调用 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();
}
片段着色器
#version 330 core
out vec4 FragColor;
uniform vec4 ourColor;
void main()
{
FragColor = ourColor;
}
编辑:我忘了指出 glUniform4f 每帧设置一个新颜色(以周期性方式),代码的最终输出是 2 个带有动画颜色的三角形,从 while 循环中删除 glUseProgram ,同时产生一个静态图像,这是不是代码的预期目标。
解决方案
在您的情况下,您可能不必每帧都设置它。然而,在更大的程序中,您将使用多个着色器,因此需要在每次使用之前设置您想要的着色器,并且可能只是编写示例来执行此操作。
推荐阅读
- sql - ActiveRecord OR 运算符将查询速度减慢 10 倍。为什么?
- java - 将 Android Studio 中的 Datepicker 存储到 Firebase (Java)
- r - How do I make my row names appear on my x axis? And the numbers on from my variables appear as the y axis?
- android - Exoplayer - 如何使用 ts 块下载简单的 m3u8 文件
- typescript - Lodash sumby 之类的通用类型
- oracle - 自治数据库上的 Oracle 钱包
- angular - 将库项目升级到 Angular 12?
- css - Bootstrap 5表单组,表单行,表单内联不起作用
- python - python将内置关键字分配给变量
- r - 合并 row.names 上的数据框:列以大写字母表示