- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在关注 OpenGL v3.3 教程,该教程指示我使用 glUniform4f 修改片段着色器中的统一属性(请参阅下面的代码)。据我了解,OpenGL 是一个状态机,我们不会取消绑定(bind)当前正在使用的着色器程序,而是修改附加到程序的着色器中的一个属性,那么为什么我们需要在每一帧上调用 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 ,同时产生一个静态图像,这是不是代码的预期目标。
最佳答案
在您的情况下,您可能不必每帧都设置它。
然而,在更大的程序中,您将使用多个着色器,因此需要在每次使用之前设置您想要的着色器,并且可能只是编写示例来执行此操作。
关于c++ - 为什么 glUseProgram 用 glUniform 调用每一帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64089592/
我正在使用 OpenGL 和 GLSL 在简单的网格上绘制纹理。 我的问题是,当我使用 glUniform1i 设置 sampler2D uniform 的值时,它没有被设置。例如在这段代码中: gl
我想知道 glUniformXXv 是否会阻塞,直到指针所指的数据被复制到 GPU。换句话说,如果 GPU 很忙,这段代码会导致问题吗? int i=5; glUniform1iv(location,
GLSL 代码和传递数据的 native 代码之间的类型必须匹配到什么程度? 例如,假设我有着色器代码: uniform float uFloat; uniform int uInt; in floa
当我调用 glUniform2fv 时到底会发生什么? 它是同步复制传递的缓冲区还是只是接受指针并稍后使用该数据?它保留缓冲区吗? 换句话说:在函数中传递本地创建的或非保留的缓冲区是否安全,或者由我来
再次嗨,欢迎来到另一个“如果我们将两件我真的不了解的事情结合起来会不会很棒”-问题;) 这一集:OpenGL 制服和 C++ 模板 想法:如果您可以编写一个模板函数来在 OpenGL 着色器中设置制服
我已经阅读了khronos的规范,我知道glProgramUniform*()将数据上传到指定的程序对象,而glUniform*()将数据上传到当前绑定(bind)的程序对象。但我想知道这两者之间是否
我目前正在编写一个 openGL 着色器类。我没有使用函数来设置每个统一类型,而是尝试将统一函数(例如 glUniform1f)作为参数传递。 我目前的尝试看起来像这样: template void
如果我有一个看起来像这样的片段着色器: #version 450 #define MAX_NUM_LIGHTS 10 #define NUM_CASCADES 6 uniform sampler2D
我正在关注 OpenGL v3.3 教程,该教程指示我使用 glUniform4f 修改片段着色器中的统一属性(请参阅下面的代码)。据我了解,OpenGL 是一个状态机,我们不会取消绑定(bind)当
背景 我目前正在围绕 OpenGL 的 glUniform 编写包装器C++ 中的函数,努力使它们类型安全。我有一堆 set_uniform 函数被重载以接受 OpenGL POD(GLint、GLu
我是一名优秀的程序员,十分优秀!