具有显式数组和非显式数组的glBufferData

时间:2013-08-26 21:15:52

标签: c++ opengl

我正在使用明确定义的顶点坐标的数组创建一个glBufferData,一切正常。当使用非显式定义的数组时,结果完全不同,我使用相同的坐标值。 drawcall以不同的顶点顺序呈现事物。

顶点是三角形网格。

代码1工作正常:

this->graphics->createBuffers(1, vboIndexsID);
this->graphics->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *vboIndexsID);
this->graphics->bufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*numIndexs, ind, GL_STATIC_DRAW);

this->graphics->createBuffers(1, vboVertexsID);
this->graphics->bindBuffer(GL_ARRAY_BUFFER, *vboVertexsID);

this->graphics->bufferData(GL_ARRAY_BUFFER, 300, quad_verts2, GL_STATIC_DRAW);

其中quad_verts2是:

GLfloat quad_verts2[75] =
{
    0.0f,   0.0f, 0.0f, 
    0.0f,   0.0f, 100.0f, 
    0.0f,   0.0f, 200.0f, 
    0.0f,   0.0f, 300.0f, 
    0.0f,   0.0f, 400.0f, 
    100.0f, 0.0f, 0.0f, 
    100.0f, 0.0f, 100.0f, 
    100.0f, 0.0f, 200.0f, 
    100.0f, 0.0f, 300.0f, 
    100.0f, 0.0f, 400.0f, 
    200.0f, 0.0f, 0.0f, 
    200.0f, 0.0f, 100.0f, 
    200.0f, 0.0f, 200.0f, 
    200.0f, 0.0f, 300.0f, 
    200.0f, 0.0f, 400.0f, 
    300.0f, 0.0f, 0.0f, 
    300.0f, 0.0f, 100.0f, 
    300.0f, 0.0f, 200.0f, 
    300.0f, 0.0f, 300.0f, 
    300.0f, 0.0f, 400.0f, 
    400.0f, 0.0f, 0.0f, 
    400.0f, 0.0f, 100.0f, 
    400.0f, 0.0f, 200.0f, 
    400.0f, 0.0f, 300.0f, 
    400.0f, 0.0f, 400.0f
};

代码2不起作用:

this->graphics->createBuffers(1, vboIndexsID);
this->graphics->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *vboIndexsID);
this->graphics->bufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*numIndexs, ind, GL_STATIC_DRAW);

this->graphics->createBuffers(1, vboVertexsID);
this->graphics->bindBuffer(GL_ARRAY_BUFFER, *vboVertexsID);

this->graphics->bufferData(GL_ARRAY_BUFFER, 300, list, GL_STATIC_DRAW);

与之前完全相同,但是列表数据而不是quad_vert2。

其中列表是:

GLfloat list[75];
int j = 0;
for(int i=0;i<numVertexs;++i) {
    list[j] = v->coord.x;j++;
    list[j] = v->coord.y;j++;
    list[j] = v->coord.z;j++;
    ++v;
}

v中的数据与quad_vert2中的数据完全相同。

glGetError,在glBufferData始终为0之后。 如果我使用glGetBufferSubData获取缓冲区中的数据,则值是相同的。

想法?

提前感谢。

2 个答案:

答案 0 :(得分:1)

我怀疑numVertexs的价值,因为您的缓冲区数据上传调用实际上并未使用它。您应该上传sizeof (GLfloat) * 3 * numVertexs个字节的数据,而不是使用幻数300。如果在两种情况下用300替换{{1}},那么它很可能会暴露您的真实问题。

答案 1 :(得分:0)

谢谢大家,

这里的问题是: 我渲染了两个具有不同顶点数的对象。渲染时,我忘了正确分配索引缓冲区,而openGL试图用第一个索引绘制第二个对象。