我正在从OGL立即模式迁移到VBO。我正在渲染四边形,我的法线在立即模式下工作。但是我无法使用VBO正常工作。
设置:
vertexData = BufferUtils.createFloatBuffer(12);
vertexData.put(new float[]{xCor[0], yCor[0], zCor[0],xCor[1], yCor[1], zCor[1],xCor[2], yCor[2], zCor[2],xCor[3], yCor[3], zCor[3]});
vertexData.flip();
texData = BufferUtils.createFloatBuffer(8);
texData.put(new float[]{tCor[0],tCor[1],tCor[2],tCor[3],tCor[4],tCor[5],tCor[6],tCor[7]});
texData.flip();
normalData = BufferUtils.createFloatBuffer(3);
normalData.put(new float[]{nCor[0],nCor[1],nCor[2]});
normalData.flip();
normalHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, normalHandle);
glBufferData(GL_ARRAY_BUFFER, normalData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vboVertexHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vboTexHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboTexHandle);
glBufferData(GL_ARRAY_BUFFER, texData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
渲染:
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glVertexPointer(3, GL_FLOAT, 0, 0L);
glBindBuffer(GL_ARRAY_BUFFER, vboTexHandle);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, normalHandle);
glNormalPointer(GL_FLOAT,0,0L);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glDrawArrays(GL_QUADS, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
在它的当前状态下,它只会点亮构成四边形的两个三角形中的一个。我可以看到原因,但加倍缓冲区大小和重复法线向量坐标并没有完全解决它。应该如何将一个normalvector输入一个四边形的VBO,即两个三角形?
答案 0 :(得分:2)
您的普通数据如何?请记住,每个顶点都包含多个属性,在您的情况下,它是[position, normal, texture_coordinate]
。
许多从立即模式转变的新手都有这样的误解,即“顶点”只是位置。他们有1次调用glNormal,然后调用3或4次glVertex,使他们认为每3或4个顶点有1个法线。不是这种情况。事实上,glVertex复制了所有其他顶点属性状态,glVertex的参数提供了position属性。
更合适的API应该是:
glNormal(…);
glPosition(…); /* that one doesn't exist */
glTexCoord(…);
glEmitVertex(); /* doesn't exist either, takes no parmeters */
然而,顶点数组只能看到易于使用的数据。因此,每个顶点都需要完整的monty,可以这么说。如果你这样做,你的代码就不清楚了。但考虑到你的问题的描述听起来很像这个问题。