C++ OpenGL-添加第二个着色器属性会导致屏幕空白
祝大家节日快乐 我正在尝试编写一个通用的C++ OpenGL-添加第二个着色器属性会导致屏幕空白,c++,opengl,glfw,glew,C++,Opengl,Glfw,Glew,祝大家节日快乐 我正在尝试编写一个通用的DrawPolygon()函数,该函数将包含许多边、位置、颜色和大小,并渲染一个n边正多边形。有人能告诉我下面的代码有什么问题吗 void drawPolygon(GLuint& vao, GLuint& vbo, GLfloat x, GLfloat y, GLfloat radius, GLint numSides) { auto numVertices = numSides + 2; auto twoPi =
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
in vec3 fColour;
out vec4 FragColor;
void main() {
FragColor = vec4(fColour, 1.0);
}
如您所见,我现在已经对颜色值进行了硬编码,但打算在工作后将其作为
vec3
传递。目前,它只是给了我一个简单的黑屏:S删除第二个属性并使用统一的,但是我想知道为什么给定的代码不起作用。MTIA 发布的代码没有设置投影均匀性——可能是在其他地方做的,但不清楚这里是否是这样。好吧,最奇怪的事情发生了:在阅读了上面@Andrea的评论之后
我觉得一切都很好…你在画画之前检查过你的程序吗
…我决定再检查一遍,因为我实际上没有想到这种可能性。我只是从在线教程中自学了OpenGL,而且只有几天的时间。所以我认为我很有可能确实犯了这样一个新手错误
因此,自从发布这个问题以来,我第一次在VS2019中打开了这个项目,在我的着色器包装类的Use()
方法中添加了一个显式的调用,而不是依赖隐式方法(请参阅以获取详细信息),你猜怎么着?就像魔术一样,我在屏幕中间有一个绿色的圆圈!
那部分并不奇怪;正如我之前所说的,我很可能误读了上面链接的Joey的教程,或者误读了代码。但关键是:在将代码返回到原始的非工作版本(从这个问题中逐字粘贴)之后,它仍然有效强>
不管怎样,我想问题解决了……我讨厌一个bug像这样神奇地修复自己;你禁不住会想,它会在以后的赛道上突然重现。但现在我正在举办一个“随机着色多边形”派对,我很喜欢 是的,其他地方也在做。谢谢你的帮助:-)我觉得一切都很好…你在画画之前检查过你的程序吗?非常感谢@Andrea,这就是问题所在!有点……详细情况见我的答案。但我仍然认为你应该得到这个代表,所以如果你给出正确的答案,我会接受;-)可疑。要么你的代码实际上与以前有细微的不同,要么这是某种未定义的行为?@Andrea Yeah不确定,尽管我认为我没有注意到一些重要的变化比发现UB更有可能。不管怎样,它现在起作用了,所以这是最主要的。如果这种情况再次发生变化,我肯定会在这里发牢骚:P
#version 330 core
in vec3 fColour;
out vec4 FragColor;
void main() {
FragColor = vec4(fColour, 1.0);
}