OpenGL ES (12): 答疑解惑 -- GLES20的绘图相关方法解释

1.介绍


之前的文章中已经写到在Render中的onDrawFrame()调用了 mTriangle.draw(),进行了三角形的绘制。

我们这里是要分析draw()里面的东西 关于GLES20的绘图方法,解释参数。

2.先看之前代码中的内容具体是怎样


public Triangle() {
        ByteBuffer bb = ByteBuffer.allocateDirect(
                triangleCoords.length * 4);
        bb.order(ByteOrder.nativeOrder());
        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(triangleCoords);
        vertexBuffer.position(0);
        int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER,
                vertexShaderCode);
        int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER,
                fragmentShaderCode);
        // create empty OpenGL ES Program
        mProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(mProgram, vertexShader);
        GLES20.glAttachShader(mProgram, fragmentShader);
        GLES20.glLinkProgram(mProgram);
    }

    public void draw(float[] mvpMatrix) {
        //GLES20相关方法
        GLES20.glUseProgram(mProgram);
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
        GLES20.glEnableVertexAttribArray(mPositionHandle);
        GLES20.glVertexAttribPointer(
                mPositionHandle,
                COORDS_PER_VERTEX,
                GLES20.GL_FLOAT,
                false,
                vertexStride,
                vertexBuffer
        );

        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);

        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
        GLES20.glDisableVertexAttribArray(mPositionHandle);
    }

分析:

        GLES20.glUseProgram(mProgram);  //使用着色器程序绘制图形
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
        GLES20.glEnableVertexAttribArray(mPositionHandle);
        GLES20.glVertexAttribPointer(...);

        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);

        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); //从第0个开始绘制,一共vertexCoiunt个顶点
        GLES20.glDisableVertexAttribArray(mPositionHandle);

其中的

  • GLES20.glGetAttribLocation(mProgram, "vPosition");  //顶点位置变量id
  • GLES20.glGetUniformLocation(mProgram, "vColor"); //颜色变量id
  • GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); //变换矩阵变量Id
  • 都是用于获取着色器程序内成员变量的id,也可以理解为句柄、指针。

当我们需要改变的东西如位置,颜色,矩阵变换等,都需要先获取这个变量的id,然后对这个变量id进行操作,就可以改变我们的绘制内容。如下:

GLES20.glEnableVertexAttribArray(mPositionHandle); //启用顶点变量位置id,之后才能传入顶点位置

GLES20.glDisableVertexAttribArray(mPositionHandle); //禁用顶点位置变量id,一般绘制结束都需要禁用

//传入顶点位置
GLES20.glVertexAttribPointer(

mPositionHandle, //对应的位置变量id

COORDS_PER_VERTEX, //每个顶点属性的组件数量。如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a)

GLES20.GL_FLOAT,  //指定数组中每个组件的数据类型

false,  //固定点数据值是否应该被归一化(GL_TRUE)或者直接转换为固定点值(GL_FALSE)

vertexStride,  //指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。反之,这些值会被直接转换为浮点值而不进行归一化处理;

vertexBuffer //顶点的缓冲数据

); 

GLES20.glUniform4fv(mColorHandle, 1, color, 0);  //操作颜色变量Id,传入一组颜色数组,无偏移量

GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); //操作矩阵变换变量id,传入一个变换矩阵,不偏移

猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/83053571