之前的文章中已经写到在Render中的onDrawFrame()调用了 mTriangle.draw(),进行了三角形的绘制。
我们这里是要分析draw()里面的东西 关于GLES20的绘图方法,解释参数。
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);
其中的
当我们需要改变的东西如位置,颜色,矩阵变换等,都需要先获取这个变量的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,传入一个变换矩阵,不偏移