C++ VBO 渲染问题

C++ VBO rendering issue

此代码工作正常,呈现正确(没有 post 每一段相关代码,因为我认为这些部分有问题):

std::vector<GLuint> vboId;
std::vector< std::vector<GLfloat> > verts;

...初始化:

verts[num].push_back(x);
verts[num].push_back(y);
//verts[num].push_back(0);
// texture offset
verts[num].push_back(0);
verts[num].push_back(offset);

verts[num].push_back(x + TILE_SIZE);
verts[num].push_back(y);
//verts[num].push_back(0);
// texture offset
verts[num].push_back(1);
verts[num].push_back(offset);

verts[num].push_back(x + TILE_SIZE);
verts[num].push_back(y + TILE_SIZE);
//verts[num].push_back(0);
// texture offset
verts[num].push_back(1);
verts[num].push_back(offset + zsize);

verts[num].push_back(x);
verts[num].push_back(y + TILE_SIZE);
//verts[num].push_back(0);
// texture offset
verts[num].push_back(0);
verts[num].push_back(offset + zsize);
...
glBindBuffer(GL_ARRAY_BUFFER, vboId[num]);
glBufferData(GL_ARRAY_BUFFER, verts[num].size() * sizeof(GLfloat), verts[num].data(), GL_STATIC_DRAW);

...渲染:

glBindBuffer(GL_ARRAY_BUFFER,vboId[num]);

glTexCoordPointer(2,GL_FLOAT,sizeof(verts[num]),(void*)(sizeof(GLfloat)*2));
glVertexPointer(2,GL_FLOAT,sizeof(verts[num]),0);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_QUADS, 0, verts[num].size());

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

但是当我尝试通过修改代码来添加 Z 值时,一切都变得一团糟:

...初始化

verts[num].push_back(x);
verts[num].push_back(y);
verts[num].push_back(0);
// texture offset
verts[num].push_back(0);
verts[num].push_back(offset);

verts[num].push_back(x + TILE_SIZE);
verts[num].push_back(y);
verts[num].push_back(0);
// texture offset
verts[num].push_back(1);
verts[num].push_back(offset);

verts[num].push_back(x + TILE_SIZE);
verts[num].push_back(y + TILE_SIZE);
verts[num].push_back(0);
// texture offset
verts[num].push_back(1);
verts[num].push_back(offset + zsize);

verts[num].push_back(x);
verts[num].push_back(y + TILE_SIZE);
verts[num].push_back(0);
// texture offset
verts[num].push_back(0);
verts[num].push_back(offset + zsize);
...
glBindBuffer(GL_ARRAY_BUFFER, vboId[num]);
glBufferData(GL_ARRAY_BUFFER, verts[num].size() * sizeof(GLfloat), verts[num].data(), GL_STATIC_DRAW);

...渲染:

glBindBuffer(GL_ARRAY_BUFFER,vboId[num]);

glTexCoordPointer(2,GL_FLOAT,sizeof(verts[num]),(void*)(sizeof(GLfloat)*3));
glVertexPointer(3,GL_FLOAT,sizeof(verts[num]),0);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_QUADS, 0, verts[num].size());

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

谁能解释一下我做错了什么?为什么第一个代码有效而最后一个无效?

我相信你原来的渲染正确只是因为顶点恰好落在相关坐标上。我认为问题在于您的步幅和初始位置。

因为你的数组看起来像

x-y-z-u-v

顶点也会有跨度,因为它们必须跳两个浮点数才能到达下一个坐标。纹理坐标也将有一个初始指针位置。

glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat) * 3, sizeof(GLfloat) * 3);
glVertexPointer(3, GL_FLOAT, sizeof(GLfloat) * 2, 0);

也就是说,对于纹理,从索引 3 (u) 开始,读取两个元素(u 和 v),然后向前移动三个元素,这将是下一个 u,因为它会跳过 x、y和 z.

对于verticies,从0(x)开始,读取三个元素,x,y,z,然后跳过两个从下一个x开始。

我想我已经解决了..这段代码呈现了它应该的样子:

glTexCoordPointer(2,GL_FLOAT,sizeof(GLfloat) * 5,(void*)(sizeof(GLfloat) * 3));
glVertexPointer(3,GL_FLOAT,sizeof(GLfloat) * 5,(void*)0);
...
glDrawArrays(GL_QUADS, 0, verts[num].size() / 5);

但我不确定它是否真的正确,我没有看到任何人工制品,但也不知道幕后发生了什么.. 感谢您的帮助,如果有人可以确认代码是否正确,请做

但是我这里理解的是glTexCoordPointer(* 5, * 3)从第三个数组索引(第一个纹理坐标)开始,每次向前增加5(索引* 5)个元素。 glVertexPointer(* 5, 0) 从数组索引 0 开始,每次也增加 5。 因此:

verts[num].push_back(x); // index 0
verts[num].push_back(y); // index 1
verts[num].push_back(0); // index 2
// texture offset
verts[num].push_back(0); // index 3
verts[num].push_back(offset); // index 4

我可以回来添加更多内容嘿嘿http://i.imgur.com/Iemih6d.png