关键字: android OpenGL 移动开发 教程
在第二课的基础上,我们给所绘制的三角形和四边形添加颜色,在本课,我们将使用两种着色模式,在三角形中用平滑着色(Smooth coloring)模式,在四边形中用平面着色(Flat coloring)模式。
在三角形的平滑着色模式中,我们建立一个颜色缓冲区colorBuffer并为之指定对应顶点的颜色。在MyTranagle.java中相关代码如下:
声明私有变量。
private FloatBuffer colorBuffer; // 颜色数组缓冲区
… … … …
在构造函数 MyTriangle中加入
privatefloat[]colors = { // 每个顶点的颜色
1.0f, 0.0f, 0.0f, 1.0f, // 红色
0.0f, 1.0f, 0.0f, 1.0f, // 绿色
0.0f, 0.0f, 1.0f, 1.0f, // 蓝色
};
… … … …
// 设置颜色数组,顶点数据为浮点数据类型。一个浮点类型的数据长度为四个字节
ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4);
cbb.order(ByteOrder.nativeOrder()); // 使用原生字节顺序
colorBuffer = cbb.asFloatBuffer();// 将字节类型缓冲区转换成浮点类型
colorBuffer.put(colors); // 将数据复制进缓冲区
colorBuffer.position(0);
… … … …
在 void draw(GL10 gl)方法中添加
gl.glEnableClientState(GL10.GL_COLOR_ARRAY); // 使能颜色数组
gl.glColorPointer(4, GL10.GL_FLOAT, 0,colorBuffer);// 指定颜色数据缓冲区
… … … …
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
在渲染三角形的例子中,我们为每个顶点定义了相应的颜色值,然后使能color-array client-state,在函数glDrawElements()中每个顶点对应的颜色将被渲染。因为每个顶点有不同的颜色,因此看起来颜色从每个角喷出,并刚好在三角形的中心汇合,三种颜色相互混合。这就是平滑着色。
在渲染四边的类MySquare.java中的draw方法中加入
gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);// 设置当前颜色
来绘制一个平面着色-蓝色的正方形。在这种情况下,所有顶点的渲染都使用一种颜色,因此不需要定义颜色数组。这里我们在在使用glDrawArrays()来渲染上班行之前加入glColor*命令来设置颜色。
MyTriangle.java
package wintop.glleson03; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.opengles.GL10; // 一个三角形包含三个顶点 public class MyTriangle { private FloatBuffer vertexBuffer; // 顶点数组缓冲区 private ByteBuffer indexBuffer; // 顶点索引缓冲区 private FloatBuffer colorBuffer; // 颜色数组缓冲区 private float[] vertices = { // 三角形的顶点 0.0f, 1.0f, 0.0f, // 0. 顶 -1.0f, -1.0f, 0.0f, // 1. 左下角 1.0f, -1.0f, 0.0f // 2. 右下角 }; private byte[] indices = {0, 1, 2}; // 顶点索引(逆时针方向 CCW) private float[] colors = { // 每个顶点的颜色 1.0f, 0.0f, 0.0f, 1.0f, // 红色 0.0f, 1.0f, 0.0f, 1.0f, // 绿色 0.0f, 0.0f, 1.0f, 1.0f, // 蓝色 }; // 构造函数 - 设置顶点数组 public MyTriangle(){ // 设置顶点数组,顶点数据为浮点数据类型。一个浮点类型的数据长度为四个字节 ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); vbb.order(ByteOrder.nativeOrder()); // 使用原生字节顺序 vertexBuffer = vbb.asFloatBuffer(); // 将字节类型缓冲区转换成浮点类型 vertexBuffer.put(vertices); // 将数据复制进缓冲区 vertexBuffer.position(0); // 定位到初始位置 // 设置索引数组,索引数据位字节类型 indexBuffer = ByteBuffer.allocateDirect(indices.length); indexBuffer.put(indices); indexBuffer.position(0); // 设置颜色数组,顶点数据为浮点数据类型。一个浮点类型的数据长度为四个字节 ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4); cbb.order(ByteOrder.nativeOrder()); // 使用原生字节顺序 colorBuffer = cbb.asFloatBuffer(); // 将字节类型缓冲区转换成浮点类型 colorBuffer.put(colors); // 将数据复制进缓冲区 colorBuffer.position(0); // 定位到初始位置 } // 渲染三角形 public void draw(GL10 gl) { gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 使能顶点数组 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); // 指定顶点数据缓冲区 gl.glEnableClientState(GL10.GL_COLOR_ARRAY); // 使能颜色数组 gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer); // 指定颜色数据缓冲区 // 通过索引数组绘制图元 gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); } }
MySquare.java
package wintop.glleson03; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.opengles.GL10; // 使用三角形带(TRIANGLE_STRIP)绘制一个正方形 public class MySquare { private FloatBuffer vertexBuffer; // 顶点数组缓冲区 private float[] vertices = { // 正方形的顶点数据 -1.0f, -1.0f, 0.0f, // 0.左下角 1.0f, -1.0f, 0.0f, // 1.右下角 -1.0f, 1.0f, 0.0f, // 2.左上角 1.0f, 1.0f, 0.0f, // 3.右上角 }; // 构造函数 - 设置顶点缓冲区 public MySquare() { // 设置顶点数组,顶点数据为浮点数据类型。一个浮点类型的数据长度为四个字节 ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); vbb.order(ByteOrder.nativeOrder()); // 使用原生字节顺序 vertexBuffer = vbb.asFloatBuffer(); // 将字节类型缓冲区转换成浮点类型 vertexBuffer.put(vertices); // 将数据复制进缓冲区 vertexBuffer.position(0); // 定位到初始位置 } // 渲染正方形 public void draw(GL10 gl){ // 使能顶点数据并指定顶点数据缓冲区 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f); // 设置当前颜色 // 通过顶点数组直接绘制图元序列 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } }
通过加入上述的颜色设置,最终我们看到的运行结果如下图所示:
源代码下载地址:http://download.csdn.net/detail/seniorwizard/4460814