我想使用OPENGL ES 1.1在Android上呈现从.obj文件加载的模型。我有顶点、顶点法线和面。当我使用GL10.GL_POINTS渲染模型时,模型看起来很好:
当我使用GL10.GL_TRIANGLES时,出现了一堆这样的形状:
这是我的绘图方法。我尝试过glDrawArrays和glDrawElements,但得到的结果相同。
以下是来自 .obj 文件的示例行:
public void draw(GL10 gl){
gl.glEnable(GL10.GL_CULL_FACE);
gl.glFrontFace(GL10.GL_CCW);
gl.glCullFace(GL10.GL_BACK);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(COORDS_PER_VERTEX, GL10.GL_FLOAT, BYTES_PER_VERTEX, m_vertexBuffer);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glNormalPointer(COORDS_PER_VERTEX, BYTES_PER_VERTEX, m_normalBuffer);
gl.glColor4f(m_color[0], m_color[1], m_color[2], m_color[3]);
gl.glScalef(0.1f, 0.1f, 0.1f);
// gl.glDrawArrays(GL10.GL_TRIANGLES, 0, m_numNormals);
gl.glDrawElements(GL10.GL_TRIANGLES, m_numIndices, GL10.GL_UNSIGNED_SHORT, m_indexBuffer);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);
gl.glDisable(GL10.GL_CULL_FACE);
}
以下是来自 .obj 文件的示例行:
v 1.012781 -1.591947 1.752353
...
vn 0.495193 0.342204 0.798517
...
# same indices within pairs
f 14978//14978 14977//14977 22659//22659
...
# different indices
f 34422//34418 34375//34371 34374//34370
关于面线的有趣之处在于,有时候v//vn对的索引相同,有时候不同。而且总共有4个法线比顶点少。我怀疑这就是导致问题的原因。但我应该如何处理呢?当我使用glDrawElements时,我应该传递哪些索引呢?
这是我初始化缓存区的方式:
public void setVertices(float[] coordinates, int size){
final ByteBuffer bb = ByteBuffer.allocateDirect(size * 4);
bb.order(ByteOrder.nativeOrder());
m_vertexBuffer = bb.asFloatBuffer();
m_vertexBuffer.put(coordinates, 0, size);
m_vertexBuffer.position(0);
m_numVertices = size / COORDS_PER_VERTEX;
}
public void setNormals(float[] coordinates, int size){
final ByteBuffer bb = ByteBuffer.allocateDirect(size * 4);
bb.order(ByteOrder.nativeOrder());
m_normalBuffer = bb.asFloatBuffer();
m_normalBuffer.put(coordinates, 0, size);
m_normalBuffer.position(0);
m_numNormals = size / COORDS_PER_VERTEX;
}
// array contains vertices and normals in the order read from the .obj file
// ie every even index is a vertex, every odd index is a normal
public void setIndices(int[] array, int size){
m_numIndices = size / 2;
final ByteBuffer bb = ByteBuffer.allocateDirect(m_numIndices * 4);
bb.order(ByteOrder.nativeOrder());
m_indexBuffer = bb.asIntBuffer();
for(int i = 0; i < size; i+=2)
m_indexBuffer.put(array[i]);
m_indexBuffer.position(0);
}
您能给我一些提示如何初始化和使用索引缓冲吗?
编辑:这是模型:bunny.obj