我正在使用明确定义的顶点坐标的数组创建一个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获取缓冲区中的数据,则值是相同的。
想法?
提前感谢。
答案 0 :(得分:1)
我怀疑numVertexs
的价值,因为您的缓冲区数据上传调用实际上并未使用它。您应该上传sizeof (GLfloat) * 3 * numVertexs
个字节的数据,而不是使用幻数300
。如果在两种情况下用300
替换{{1}},那么它很可能会暴露您的真实问题。
答案 1 :(得分:0)
谢谢大家,
这里的问题是: 我渲染了两个具有不同顶点数的对象。渲染时,我忘了正确分配索引缓冲区,而openGL试图用第一个索引绘制第二个对象。