OpenGL-ES-Line

  • 绘制了x,y坐标轴
  • 绘制了4条直线

一些函数说明:

  1. gl.glLoadIdentity(): 将当前画布矩阵的状态回归初始状态。

    因为TranslateRotate等操作都是基于当前画布矩阵的状态,如果在每次调用Translate之前不使用glLoadIdentity(),画布则会一直移动。

  2. gl.glTranslatef(0, 0, -4): 将画布后移4个单位。

  3. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertex):设置顶点

    参数说明:

    • 每个顶点的坐标个数(只能是2,3,4中的一个,默认值是4)
    • 每个顶点的数据类型(可取常量:GL_BYTE, GL_SHORT,GL_FIXED,GL_FLOAT)
    • 连续顶点之间的排列方式(如果为0,数组中的顶点就会被认为是按照紧凑方式排列的,默认值为0)
    • 数组的首地址(Android中就是数组名)
  4. gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, 4):绘制函数

    参数说明:

    • 绘制方式:
      • GL_POINTS:点
      • GL_LINES:线,2点构成的独立的线
      • GL_LINE_LOOP:线,所有点连接的线,首尾相接
      • GL_LINE_STRIP:线,所有点连接的线,首尾不相接
      • GL_TRIANGLES:三角形,3点构成的独立的三角形
      • GL_TRIANGLE_STRIP:三角形,详见
      • GL_TRIANGLE_FAN:三角形,详见
    • 从数组缓存中的哪一位开始绘制,一般为0
    • 数组中顶点的数量


      private void drawLine(GL10 gl) {
      //画坐标轴
      float[] vertexArr1 = {
          -1.0f, 0.0f, 0.0f,
          1.0f, 0.0f, 0.0f,
          0.0f, 1.0f, 0.0f,
          0.0f, -1.0f, 0.0f
      };
      
      ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertexArr1.length * 4);
      byteBuffer.order(ByteOrder.nativeOrder());
      FloatBuffer floatBuffer1 = byteBuffer.asFloatBuffer();
      floatBuffer1.put(vertexArr1);
      floatBuffer1.position(0);
      gl.glColor4f(0.0f, 1.0f, 0.0f, 0.0f);
      gl.glLineWidth(5.0f);
      gl.glLoadIdentity();
      gl.glTranslatef(0, 0, -4);
      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
      gl.glVertexPointer(3, GL10.GL_FLOAT, 0, floatBuffer1);
      gl.glDrawArrays(GL10.GL_LINES, 0, 4);
      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
      
      //4条线
      float[] vertexArr2 = {
          -0.5f, -0.5f, 0f,
          0.0f, .5f, 0f,
          0.5f, -0.5f, 0f,
          0.9f, -0.0f, 0f,
      };
      byteBuffer = ByteBuffer.allocateDirect(vertexArr2.length * 4);
      byteBuffer.order(ByteOrder.nativeOrder());
      FloatBuffer floatBuffer2 = byteBuffer.asFloatBuffer();
      floatBuffer2.put(vertexArr2);
      floatBuffer2.position(0);
      gl.glColor4f(1.0f, 0.0f, 0.0f, 0.0f);
      gl.glLineWidth(20.0f);
      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
      gl.glVertexPointer(3, GL10.GL_FLOAT, 0, floatBuffer2);
      gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, 4);
      }