Andriod OpenGL 教程 03 - 添加颜色

来源:互联网 发布:基因表达数据 编辑:程序博客网 时间:2024/04/27 09:08

关键字: 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

原创粉丝点击