Android OpenGL ES 简明开发教程三:3D绘图基本概念

http://www.imobilebbs.com/wordpress/?p=1512

 

 

public class Square {
	
	private float vertices[] = {
			-1.0f, 1.0f, 0.0f,
			-1.0f, -1.0f, 0.0f,
			1.0f, -1.0f, 0.0f,
			1.0f, 1.0f, 0.0f,
	};
	
	private short[] indices = {0, 1, 2, 0, 2, 3};
	
	private FloatBuffer vertexBuffer;
	
	private ShortBuffer indexBuffer;
	
	public Square() {
		//分配新的直接字节缓冲区。
		ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
		//获取底层平台的本机字节顺序。
		vbb.order(ByteOrder.nativeOrder());
		//创建此字节缓冲区的视图,作为 float 缓冲区。
		vertexBuffer = vbb.asFloatBuffer();
		//此方法将给定源 float 数组中的所有内容传输到此缓冲区中。
		vertexBuffer.put(vertices);
		//设置此缓冲区的位置。如果标记已定义且大于新的位置,则丢弃该标记。
		vertexBuffer.position(0);
		
		ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
		ibb.order(ByteOrder.nativeOrder());
		indexBuffer = ibb.asShortBuffer();
		indexBuffer.put(indices);
		indexBuffer.position(0);
		
	}
	
	public void draw(GL10 gl) {
		//设置逆时针方法为面的“前面”
		gl.glFrontFace(GL10.GL_CCW);
		//打开忽略“后面”装置
		gl.glEnable(GL10.GL_CULL_FACE);
		//“忽略”后面
		gl.glCullFace(GL10.GL_BACK);
		//Enabled the vertices buffer for writing and to be used during rendering.
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		/*
		 * size:每个顶点有几个数指描述。必须是2,3  ,4 之一,初始值是4.
		 * type:数组中每个顶点的坐标类型。取值:GL_BYTE, GL_SHORT , GL_FIXED , GL_FLOAT,   初始值 GL_FLOAT
		 * stride:数组中每个顶点间的间隔,步长(字节位移)。取值若为0,表示数组是连续的   初始值为0
		 * pointer:It's your array ,存储着每个顶点的坐标值。初始值为0
		 */
		gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
		/*
		 * mode:指定要绘制哪种图元,可以为如下几种:GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES,         GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, and GL_POLYGON. 
		 * count:要绘制的点的个数
		 * type:索引值的类型,可以为如下几种:GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT
		 * indices:指向索引存贮位置的指针
		 */
		gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, 
				GL10.GL_UNSIGNED_SHORT, indexBuffer);
		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
		gl.glDisable(GL10.GL_CULL_FACE);
	}
}


 

			//这是因为每次调用onDrawFrame 时,每次都再向后移动4个单位,需要加上重置Matrix的代码。
			gl.glLoadIdentity();
			//因为OpenGL ES从当前位置开始渲染,缺省坐标为(0,0,0),和View port 的坐标一样,
			//相当于把画面放在眼前,对应这种情况OpenGL不会渲染离view Port很近的画面,因此我们需要将画面向后退一点距离:
			gl.glTranslatef(0, 0, -8);


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值