我编写了2个三角形的代码,使用索引从4个顶点绘制:
GLES20.glUseProgram ( shader );
GLES20.glEnableVertexAttribArray ( posLoc );
GLES20.glVertexAttribPointer ( posLoc , 3 , GLES20.GL_FLOAT , false , 12 , field.verticesBuffer );
//GLES20.glDrawElements ( GL10.GL_TRIANGLES , 3 , GL10.GL_UNSIGNED_SHORT , field.indicesBuffer );
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, field.vertices.length/3);
GLES20.glDisableVertexAttribArray ( posLoc );
GLES20.glUseProgram ( 0 );
每次抽奖调用一次。我试过glDrawArrays
和glDrawElements
都无济于事。我的顶点和索引定义如下:
public static class Field
{
private final int BYTES_PER_FLOAT = 4;
private final int BYTES_PER_SHORT = 2;
public float vertices [ ] = {
- 0.5f , + 0.5f , + 0.0f , // top
// left
- 0.5f , - 0.5f , + 0.0f , // bottom
// left
+ 0.5f , - 0.5f , + 0.0f , // bottom
// right
+ 0.5f , + 0.5f , + 0.0f , // top
// right
};
public short indices [ ] = { 0 , 1 , 2 , 3, 0, 2 };
public FloatBuffer verticesBuffer = ByteBuffer.allocateDirect ( vertices.length * BYTES_PER_FLOAT ).order ( ByteOrder.nativeOrder ( ) ).asFloatBuffer ( );
public ShortBuffer indicesBuffer = ByteBuffer.allocateDirect ( indices.length * BYTES_PER_SHORT ).order ( ByteOrder.nativeOrder ( ) ).asShortBuffer ( );
public Field ( )
{
verticesBuffer.put ( vertices ).position ( 0 );
indicesBuffer.put ( indices ).position ( 0 );
}
}
在大多数情况下,代码与Android's developer site的代码完全相同。我已经在这个问题上摸索了很长一段时间了,并且非常想理解为什么代码不起作用。我有一些常规的OpenGL背景,但对OpenGL ES来说真的很新。如果您需要查看我的着色器代码或任何其他代码,请询问。
答案 0 :(得分:1)
您应该使用您尝试的glDrawElements
版本,但将硬编码的3
替换为实际的绘图列表长度。
GLES20.glDrawElements(GL10.GL_TRIANGLES, field.indices.length, GL10.GL_UNSIGNED_SHORT, field.indicesBuffer);
该参数是要绘制的元素的数量。