0

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

顶点是三角形网格。

代码 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 获取缓冲区中的数据,则值是相同的。

想法?

提前致谢。

4

2 回答 2

1

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

于 2013-08-26T21:59:34.620 回答
0

谢谢你们,

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

于 2013-09-08T10:15:16.860 回答