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
此代码工作正常,呈现正确(没有 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