`
yuanyao
  • 浏览: 145321 次
  • 性别: Icon_minigender_1
  • 来自: 就那小山沟
社区版块
存档分类
最新评论

OpenGL ES 画正方形

阅读更多

最近玩玩Android的openGL,做了点注释,有用看看,没有了无视

public class GL1 extends Activity {

	private GLSurfaceView mGLSurfaceView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		mGLSurfaceView = new GLSurfaceView(this);
		mGLSurfaceView.setRenderer(new One());
		setContentView(mGLSurfaceView);
	}

	@Override
	protected void onResume() {
		super.onResume();
		mGLSurfaceView.onResume();
	}

	@Override
	protected void onPause() {
		super.onPause();
		mGLSurfaceView.onPause();
	}

}

/**
 * 渲染器
 * 
 * @author yaoyuan
 * 
 */
class One implements Renderer {

	private Square square;

	public One() {
		square = new Square();
	}

	/**
	 * 初始化视图
	 */
	public void onDrawFrame(GL10 gl) {
		/*
		 * 清空缓冲区预设值
		 * 
		 * GL_COLOR_BUFFER_BIT 颜色缓冲区
		 * 
		 * GL_DEPTH_BUFFER_BIT 深度缓冲区
		 * 
		 * GL_STENCIL_BUFFER_BIT 模板缓冲区
		 */
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
		gl.glLoadIdentity();
		//乘一个翻译矩阵代替当前的矩阵
		gl.glTranslatef(0.0f, 0.0f, -6.0f);
		//画图形
		square.draw(gl);
	}

	/**
	 * 视图改变时调用
	 */
	public void onSurfaceChanged(GL10 gl, int width, int height) {
		if (height == 0) {
			height = 1;
		}

		gl.glViewport(0, 0, width, height);
		/**
		 * 指定当前的矩阵模式
		 * 
		 * GL_MODELVIEW 模型视图 GL_PROJECTION 投影 GL_TEXTURE 纹理
		 */
		gl.glMatrixMode(GL10.GL_PROJECTION);
		// 替换当前矩阵矩阵的身份
		gl.glLoadIdentity();
		// 设置一个透视投影矩阵
		GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
				100.0f);

		gl.glMatrixMode(GL10.GL_MODELVIEW);
		gl.glLoadIdentity();
	}

	/**
	 * 视图创建时调用
	 */
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		/*
		 * 设置阴影模式 1.GL_FLAT 扁平 2.GL_SMOOTH 平滑
		 */
		gl.glShadeModel(GL10.GL_SMOOTH);
		// 指定颜色缓冲区值
		gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		// 指定深度缓冲区值
		gl.glClearDepthf(1.0f);
		// 可用GL服务端功能
		gl.glEnable(GL10.GL_DEPTH_TEST);
		/*
		 * 深度缓存比较
		 * 
		 * GL_NEVER 不通过
		 * 
		 * GL_LESS 如果传入的深度值小于存储深度的值,通过
		 * 
		 * GL_EQUAL 如果传入的传递深度值等于存储的深度值,通过
		 * 
		 * GL_LEQUAL 如果传入的深度值小于或等于存储的深度值,通过
		 * 
		 * GL_GREATER 如果传入的深度值大于存储深度值更大,通过
		 * 
		 * GL_NOTEQUAL 如果传入的深度值不等于存储深度值,通过
		 * 
		 * GL_GEQUAL 如果传入的深度值大于或等于存储深度值,通过
		 * 
		 * GL_ALWAYS 始终通过
		 */
		gl.glDepthFunc(GL10.GL_LEQUAL);
		// 指定特定于实现的提示
		gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
	}

}

/**
 * 图形
 * 
 * @author yaoyuan
 * 
 */
class Square {
	private FloatBuffer vertexBuffer;
	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 
	};

	public Square() {
		ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
		byteBuf.order(ByteOrder.nativeOrder());
		vertexBuffer = byteBuf.asFloatBuffer();
		vertexBuffer.put(vertices);
		vertexBuffer.position(0);
	}

	public void draw(GL10 gl) {
		// 定义前、后面对(GL_CW顺时针、GL_CCW逆时针)
		gl.glFrontFace(GL10.GL_CW);
		// 定义一个定点坐标数组
		gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
		/*
		 * 启用客户端功能
		 * 
		 * GL_COLOR_ARRAY 当glDrawArrays、glDrawElements被调用时,颜色数组可以被读写
		 * 
		 * GL_NORMAL_ARRAY 当glDrawArrays、glDrawElements被调用时,普通数组可以被读写
		 * 
		 * GL_TEXTURE_COORD_ARRAY 当glDrawArrays、glDrawElements被调用时,紋理數組可以被读写
		 * 
		 * GL_VERTEX_ARRAY 当glDrawArrays、glDrawElements被调用时,矩阵数组可以被读写
		 */
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		// 从数组数据中渲染图元
		gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
		// 禁用客户端功能
		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
	}
}
 
1
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics