OpenGL - 添加第二个着色器属性会导致空白屏幕

OpenGL - Adding a second shader attribute causes a blank screen

本文关键字:空白 屏幕 属性 添加 第二个 OpenGL      更新时间:2023-10-16

季节问候大家!

我正在尝试编写一个通用的DrawPolygon()函数,该函数将采用多个边、位置、颜色和大小,并呈现一个 n 边正多边形。有人可以告诉我以下代码有什么问题吗?

void drawPolygon(GLuint& vao, GLuint& vbo, GLfloat x,
GLfloat y, GLfloat radius, GLint numSides) {
auto numVertices = numSides + 2;
auto twoPi = 2.0f * M_PI;
auto vertexData = new GLfloat[numVertices * 5];
for (int i = 0; i < numVertices; i++) {
vertexData[i * 5] = x + (radius *
cos(i * twoPi / numSides));
vertexData[i * 5 + 1] = y + (radius *
sin(i * twoPi / numSides));
vertexData[i * 5 + 2] = 0.0f;  // Colour data: red
vertexData[i * 5 + 3] = 1.0f;  // Colour data: green
vertexData[i * 5 + 4] = 0.0f;  // Colour data: blue
}
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(
GLfloat) * 5, vertexData, GL_STATIC_DRAW);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE,
5 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 *
sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices);
auto error = glGetError();  // returns 0, i.e. no error
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
delete[] vertexData;
}

顶点着色器:

#version 330 core
layout (location = 0) in vec2 aPos;
layout (location = 1) in vec3 aColour;
uniform mat4 projection;
out vec3 fColour;
void main() {
gl_Position = projection * vec4(
aPos.x, aPos.y, 0.0, 1.0); 
fColour = aColour;
}

片段着色器:

#version 330 core
in vec3 fColour;
out vec4 FragColor;
void main() {
FragColor = vec4(fColour, 1.0);   
}

如您所见,我现在已经对颜色值进行了硬编码,但打算在工作后将它们作为vec3传入。目前它只是给了我一个普通的黑屏:S 删除第二个属性并使用uniform反而有效,但我想知道为什么给定的代码没有。米蒂亚!

发布的代码没有设置投影统一 - 也许这是在其他地方完成的,但不清楚这里是否是这种情况。

好吧,最奇怪的事情刚刚发生:在阅读了@Andrea上面的评论之后......

一切对我来说都很好...在绘制之前,您是否检查过是否已找到正确的程序?

。我决定仔细检查,因为我实际上并没有想到这种可能性。我只是从在线教程中自学OpenGL,而且只有几天。所以我觉得很有可能我确实犯了这样的菜鸟错误。

因此,自从发布此问题以来,我第一次在VS 2019中打开了该项目,为我的Shader包装类的Use()方法添加了显式调用,而不是依赖于隐式方法(有关详细信息,请参阅此处(,你猜怎么着?就像变魔术一样,我在屏幕中间得到了一个绿色的圆圈!

这部分并不奇怪;正如我之前所说,我很可能误读了上面链接的Joey教程或错误地复制了代码。但问题是:将代码返回到原始非工作版本(逐字粘贴此问题(后,它仍然有效!!

无论如何问题解决了,我想...我讨厌一个错误像这样神奇地修复自己;你不禁会想到它会在以后突然重新出现。但现在我正在举办一个"随机颜色的多边形"派对,并且喜欢它!