OpenGL ES只绘制一个三角形

时间:2015-10-06 21:44:50

标签: java android opengl-es

我编写了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 );

每次抽奖调用一次。我试过glDrawArraysglDrawElements都无济于事。我的顶点和索引定义如下:

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来说真的很新。如果您需要查看我的着色器代码或任何其他代码,请询问。

1 个答案:

答案 0 :(得分:1)

您应该使用您尝试的glDrawElements版本,但将硬编码的3替换为实际的绘图列表长度。

GLES20.glDrawElements(GL10.GL_TRIANGLES, field.indices.length, GL10.GL_UNSIGNED_SHORT, field.indicesBuffer);

该参数是要绘制的元素的数量。