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
- Andriod OpenGL 教程 03 - 添加颜色
- 【Qt OpenGL教程】03:添加颜色
- NeHe OpenGL教程 第三课 添加颜色
- Andriod OpenGL 教程 04 - 旋转
- Andriod OpenGL 教程 08 - 混合
- Android OpenGL ES 简明开发教程五:添加颜色
- Android OpenGL ES 简明开发教程五:添加颜色
- Android OpenGL ES 简明开发教程五:添加颜色
- Android OpenGL ES 简明开发教程 05 <添加颜色>
- Android OpenGL ES 简明开发教程五:添加颜色
- Android OpenGL ES 简明开发教程_添加颜色
- Android OpenGL添加颜色
- Andriod OpenGL 教程 02 - 第一个多边形
- Andriod OpenGL 教程 05 - 3D空间
- Andriod OpenGL 教程 06 - 纹理映射
- Andriod OpenGL 教程 09 - 移动图像
- Andriod OpenGL 教程 10 - 3D世界
- Andriod OpenGL 教程 01 - 创建一个OpenGL 窗口
- executeQuery()、executeUpdate() 和 execute()
- Unity3D Android游戏添加google广告的方法——使用AdMob
- truncate drop delete difference
- 正则表达式学习(二)正则表达式的操作符及说明
- JSP九大内置对象的作用和用法总结?
- Andriod OpenGL 教程 03 - 添加颜色
- hdu 1044Collect More Jewels ( bfs + dfs )
- STL中的排序算法一览
- [java]Math中的ceil--floor--round
- MPEG-4 AVC/H.264 一些知识
- qt 编译c文件,extern “c”
- Header();
- Hibernate的实体类中为什么要继承Serializable?
- 事务相关