Andriod OpenGL 教程 03 - 添加颜色

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

你可能感兴趣的:(移动开发,Class,import,float,byte,colors)