|
|
搜了很多关于VBO的文章,已经有点了解了,但一直有个问题没找到答案,请各位大大指点一二,谢谢:
顶点缓冲可以把法线、顶点坐标、纹理坐标分别创建缓冲进行索引,但这里有个问题就是一个模型通常顶点坐标、法线和纹理坐标并不是一样多,也就是说一个顶点有一个顶点坐标,但可能有多个法线或纹理坐标,这种情况如何索引呢?
不知道我有没有说明白,呵呵,下面是OPENGL超级宝典里的代码,为一个模型创建了4个缓冲区,有一个是索引缓冲,其它的三个缓冲点数是相同的,我想问的是如果点数不同的时候如何处理?也就是一个顶点坐标对应多个纹理坐标或法线的情况。
void CVBOMesh::EndMesh(void)
{
// Create the buffer objects
glGenBuffers(4, bufferObjects);
// Copy data to video memory
// Vertex data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3,pVerts, GL_STATIC_DRAW);
// Normal data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pNorms, GL_STATIC_DRAW);
// Texture coordinates
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*2, pTexCoords, GL_STATIC_DRAW);
// Indexes
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*nNumIndexes, pIndexes, GL_STATIC_DRAW);
// Free older, larger arrays
delete [] pIndexes;
delete [] pVerts;
delete [] pNorms;
delete [] pTexCoords;
// Reassign pointers so they are marked as unused
pIndexes = NULL;
pVerts = NULL;
pNorms = NULL;
pTexCoords = NULL;
} |
|