在分解代码时出现奇怪的OpenGL问题

时间:2014-11-07 02:54:49

标签: c++ opengl struct buffer

所以我有一些代码可以创建一个缓冲区并在其中放置一些顶点:

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glEnableVertexAttribArray(0);

我还将它绑定到着色器属性:

glBindAttribLocation(programID, 0, "pos");

最后,画出来:

glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glDrawArrays(GL_TRIANGLES, 0, 3);

当然,还有其他代码,但所有这些东西运行正常(在屏幕上显示一个红色三角形)

然而,当我尝试将这些东西放在一个结构中时,没有任何东西会显示(这是其中一种方法):

void loadVerts(GLfloat verts[], int indices)
    {
        GLuint vertexbuffer;
        glGenBuffers(1, &vertexbuffer);
        glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
        glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
        glVertexAttribPointer(indice, indices, GL_FLOAT, GL_FALSE, 0, 0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glEnableVertexAttribArray(indice);
        indice++;
        buffers.push_back(vertexbuffer);
    }

我已经对这个代码进行了四倍检查,并且我还跟踪它以确保它在调用时与上面的代码匹配。我的平局电话几乎和我原来的一样:

void draw()
    {
        glBindBuffer(GL_ARRAY_BUFFER, buffers.at(0));
        glDrawArrays(GL_TRIANGLES, 0, 3);
    }

我也试过把它变成一个类,并添加/更改代码的许多部分。 buffersindice只是跟踪缓冲区和属性索引的一些变量。 buffersstd::vector<GLuint> FWIW。

1 个答案:

答案 0 :(得分:2)

主要问题在于:

void loadVerts(GLfloat verts[], int indices)
{
    ...
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);

verts参数的类型是指向GLfloat的指针。您的功能签名相当于:

void loadVerts(GLfloat* verts, int indices)

因此sizeof(verts)用作glBufferData()的第二个参数,在32位体系结构上为4,在64位体系结构上为8。

您需要将此大小作为附加参数传递给此函数,并将该值用作glBufferData()的第二个参数。

这些陈述看起来有些令人困惑:

glVertexAttribPointer(indice, indices, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(indice);

我无法判断是否存在真正的问题,但是您有两个名称非常相似的变量,使用方式非常不同。 indice需要是顶点着色器中属性的位置,而indices必须是属性中组件的数量。