All pastes #2092083 Raw Edit

Something

public java v1 · immutable
#2092083 ·published 2011-10-21 04:21 UTC
rendered paste body
/**** file : HelloWorldRenderer.java ****/package com.leftcode.android.HelloWorld;import java.nio.ByteBuffer;import java.nio.ByteOrder;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;import android.opengl.GLSurfaceView.Renderer;import android.opengl.GLU;public class HelloWorldRenderer implements Renderer {	public HelloWorldRenderer(Main main) {		createBuffers();	}	public void onSurfaceCreated(GL10 gl, EGLConfig config) {		gl.glDisable(GL10.GL_DITHER); // 颜色抖动据说可能严重影响性能,禁用		gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// 设置清除颜色缓冲区时用的RGBA颜色值				gl.glEnable(GL10.GL_DEPTH_TEST); // 开启尝试测试		gl.glDepthFunc(GL10.GL_LEQUAL); // 尝试测试方法为小于等于		gl.glClearDepthf(1f); // 清除缓冲时要用的值	}	public void onSurfaceChanged(GL10 gl, int width, int height) {		// 宽高比		float aspect = (float) width / (float) (height == 0 ? 1 : height);				// 设置视口		gl.glViewport(0, 0, width, height);				// 设置当前矩阵堆栈为投影矩阵,并将矩阵重置为单位矩阵		gl.glMatrixMode(GL10.GL_PROJECTION);		gl.glLoadIdentity();				// 变换当前矩阵(投影矩阵),最终投影矩阵效果相当于:		// 人眼位于坐标 5,5,5 的位置,视野中心注视着 0,0,0 点,		// 垂直视野可见角度为45度,可见范围从眼前 0.1 到 200 单位远,		// Y 坐标正向为上方		GLU.gluPerspective(gl, 45.0f, aspect, 0.1f, 200.0f);		GLU.gluLookAt(gl, 5f, 5f, 5f, 0f, 0f, 0f, 0, 1, 0);	}	public void onDrawFrame(GL10 gl) {		// 清除颜色缓冲		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);				// 设置当前矩阵堆栈为模型堆栈,并重置堆栈,		// 即随后的矩阵操作将应用到要绘制的模型上		gl.glMatrixMode(GL10.GL_MODELVIEW);		gl.glLoadIdentity();				gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, new float[] { 5, 5, 5, 1 }, 0);				// 将旋转矩阵应用到当前矩阵堆栈上,即旋转模型		gl.glRotatef(anglez, 0, 0, 1);		gl.glRotatef(angley, 0, 1, 0);		gl.glRotatef(anglex, 1, 0, 0);				anglex += 0.1; // 递增角度值以便每次以不同角度绘制		angley += 0.2;		anglez += 0.3;				// 启用顶点数组、法向量、颜色数组		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);		gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);		gl.glEnableClientState(GL10.GL_COLOR_ARRAY);				// 设置顶点数组指针为 ByteBuffer 对象 vertices		// 第一个参数为每个顶点包含的数据长度(以第二个参数表示的数据类型为单位)		gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);		gl.glColorPointer(4, GL10.GL_FLOAT, 0, colors);				// 绘制 triangles 表示的三角形		gl.glDrawElements(GL10.GL_TRIANGLES, triangles.remaining(), GL10.GL_UNSIGNED_BYTE, triangles);				// 禁用顶点、法向量、颜色数组		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);		gl.glDisableClientState(GL10.GL_COLOR_ARRAY);	}	private void createBuffers() {		// 创建顶点缓冲,顶点数组使用 float 类型,每个 float 长4个字节		// 并设置字节顺序为本机顺序		// 然后通过 FloatBuffer 适配器将 float 数组写入到 ByteBuffer 中		vertices = ByteBuffer.allocateDirect(data_vertices.length * 4);		vertices.order(ByteOrder.nativeOrder());		vertices.asFloatBuffer().put(data_vertices); 		vertices.position(0); // 重置Buffer的当前位置				// 创建索引缓冲,索引使用 byte 类型,所以无需设置字节顺序,也无需写入适配。		triangles = ByteBuffer.allocateDirect(data_triangles.length * 2);		triangles.put(data_triangles);		triangles.position(0);				// 创建颜色缓冲		colors = ByteBuffer.allocateDirect(data_colors.length * 4);		colors.order(ByteOrder.nativeOrder());		colors.asFloatBuffer().put(data_colors);		colors.position(0);	}	private ByteBuffer vertices;	private ByteBuffer triangles;	private ByteBuffer colors;	private float anglex = 0f;	private float angley = 0f;	private float anglez = 0f;	private float[] data_vertices = { 			1, 1, 1, 			1, -1, 1, 			-1, -1, 1, 			-1, 1, 1,			1, 1, -1, 			1, -1, -1, 			-1, -1, -1, 			-1, 1, -1, 	};	private float[] data_colors = { 			1, 1, 0, 1, 			1, 0, 1, 1, 			0, 1, 1, 1, 			1, 0, 0, 1, 			0, 0, 0, 1, 			0, 0, 1, 1, 			0, 1, 0, 1, 			1, 1, 1, 1, 	};	private byte[] data_triangles = { 			0, 1, 2, 			0, 2, 3, 			0, 3, 7, 			0, 7, 4, 			0, 4, 5, 			0, 5, 1, 			6, 5, 4, 			6, 4, 7, 			6, 7, 3, 			6, 3, 2, 			6, 2, 1, 			6, 1, 5 	};}