Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL-添加第二个着色器属性会导致屏幕空白_C++_Opengl_Glfw_Glew - Fatal编程技术网

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);   
}