所以我有一些代码可以创建一个缓冲区并在其中放置一些顶点:
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);
}
我也试过把它变成一个类,并添加/更改代码的许多部分。 buffers
和indice
只是跟踪缓冲区和属性索引的一些变量。 buffers
是std::vector<GLuint>
FWIW。
答案 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
必须是属性中组件的数量。