OpenGL ES 颜色缓冲 深度测试 表面剔除

1、修改MyAbstractRenderer.java 启用颜色缓冲区

 public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
        //设置清屏色(背景)
        gl.glClearColor(0, 0, 0, 1);
        //启用顶点缓冲区
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //为了给每个点都有颜色 启用颜色缓冲区
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    }

2、创建 MyTriangleConeRenderer 类

public class MyTriangleConeRenderer extends MyAbstractRenderer {

	protected void drawBefore(GL10 gl) {
		//清除颜色缓冲区 |深度缓冲区
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
		//启用深度测试 导致点计算
		gl.glEnable(GL10.GL_DEPTH_TEST);
		//启用表面剔除 //剔除 :如果看不见 就告诉openGL 不用绘制 (提高性能)
		gl.glEnable(GL10.GL_CULL_FACE);
		gl.glFrontFace(GL10.GL_CW);//顺时针  为正面
//		
		//绘制指定两点间其他点颜色的过渡模式
		gl.glShadeModel(GL10.GL_FLAT);  //单调模式 没有过度 
//		gl.glShadeModel(GL10.GL_SMOOTH); //默认平滑 过度
	}
	
	@Override
	protected void draw(GL10 gl) {
		float r =0.5f;
		float x =0f;
		float y =-1f;
		float z =0f;
		float alphaStep=(float) (Math.PI/8);
		//扇面点集合
		List fanList=new ArrayList();
		fanList.add(0f);
		fanList.add(1f);
		fanList.add(0f);
		//底面点集合
		List bottomList =new ArrayList();
		bottomList.add(0f);
		bottomList.add(y);
		bottomList.add(0f);
		
		//颜色集合
		List colorList =new ArrayList();
		colorList.add(1f);//r
		colorList.add(1f);//g
		colorList.add(0f);//b
		colorList.add(1f);//a
		
		boolean flag =false;
		boolean first =true;
		for(float alpha =0f;alpha colorList){
		colorList.add(1f);//r
		colorList.add(0f);//g
		colorList.add(0f);//b
		colorList.add(1f);//a
	}
	private void yellowColor(List colorList){
		colorList.add(1f);//r
		colorList.add(1f);//g
		colorList.add(0f);//b
		colorList.add(1f);//a
	}
	private void whiteColor(List colorList){
		colorList.add(1f);//r
		colorList.add(1f);//g
		colorList.add(1f);//b
		colorList.add(1f);//a
	}
}

3、运行效果

OpenGL ES 颜色缓冲 深度测试 表面剔除_第1张图片

你可能感兴趣的:(OpenGL,ES)