【发布时间】:2020-08-18 08:00:31
【问题描述】:
我有这个示例代码
// EBO is just a rectangle
// copypasted from learnopengl
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glUniform1f(glGetUniformLocation(shaderId, shiftName), 0); //shiftName is string "shift"
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glUniform1f(glGetUniformLocation(shaderId, shiftName), 0.5);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glFlush();
SDL_GL_SwapWindow(window);
我拥有的着色器:
顶点:
#version 330 core
layout (location = 0) in vec3 pos;
out vec4 vertexColor;
uniform float shift = 0;
void main()
{
gl_Position = vec4(pos.x, pos.y - shift, pos.z, 1.0);
vertexColor = vec4(0, shift, 0, 1.0);
}
片段:
#version 330 core
out vec4 FragColor;
in vec4 vertexColor;
void main()
{
FragColor = vertexColor;
}
根据我的理解,对于每个 glDraw 调用,我应该得到两个矩形,一个在另一个之下,有两种颜色。但相反,我得到一个矩形进行第二次绘制。
我假设,两个绘图调用实际上都为我绘制了一个相同的矩形。但我显然不明白为什么。
我尝试在两者之间进行刷新、创建第二个缓冲区、glUseProgram 等。
可以看完整代码here
【问题讨论】:
-
你在代码的什么地方指定了两种颜色?
-
在顶点着色器中,
vertexColor = ...shift... -
" 假设两个绘图调用实际上都为我绘制了一个相同的矩形。"到目前为止,问题中提供的信息中没有任何内容支持该假设。请显示实际代码以重现问题。
-
@derhass 我在这里用我的所有代码创建了要点gist.github.com/leviska/e2c2ebb15eeb0b7a076a7daa0398ba6d
-
请不要使用指向源代码的链接,请将相关源添加到问题本身。在这种特殊情况下,甚至问题都没有缺少相关部分,它实际上包含 wrong 信息,这些信息隐藏了实际来源中的错误 - 我已经找到了。