您的位置:首页 > 运维架构

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

2015-08-02 22:18 351 查看
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<Float> fanList=new ArrayList<Float>();
fanList.add(0f);
fanList.add(1f);
fanList.add(0f);
//底面点集合
List<Float> bottomList =new ArrayList<Float>();
bottomList.add(0f);
bottomList.add(y);
bottomList.add(0f);

//颜色集合
List<Float> colorList =new ArrayList<Float>();
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<Math.PI*2+alphaStep;alpha+=alphaStep){
x=(float) (r*Math.cos(alpha));
z=(float) (r*Math.sin(alpha));
//扇面点坐标
fanList.add(x);
fanList.add(y);
fanList.add(z);
//底面点坐标
bottomList.add(x);
bottomList.add(y);
bottomList.add(z);
//点色值
if(flag =!flag){
redColor(colorList);
}else{
if(first){
first =false;
whiteColor(colorList);
}else{
yellowColor(colorList);
}
}
}
if(flag =!flag){
redColor(colorList);
}else{
yellowColor(colorList);
}
//扇面颜色
ByteBuffer cFIbb =BufferUtil.list2ByteBuffer(colorList);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, cFIbb);
//由于 绘制扇面是顺时针
//设置了 gl.glFrontFace(GL10.GL_CW);顺时针 为正面
//要满足能看到扇面 则要剔除 背面
gl.glCullFace(GL10.GL_BACK);//如果下面 没有再设值 则一直使用剔除背面
//扇面点
ByteBuffer fIbb=BufferUtil.list2ByteBuffer(fanList);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fIbb);
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, fanList.size()/3);
//底面颜色
ByteBuffer cBIbb =BufferUtil.list2ByteBuffer(colorList);
cBIbb.position(4*4); //偏移一个点像素 使其底面颜色与扇面间隔开
gl.glColorPointer(4, GL10.GL_FLOAT, 0, cBIbb);
//由于 绘制底面是逆时针
//设置了 gl.glFrontFace(GL10.GL_CW);顺时针 为正面
//要满足能看到底面 则要剔除 前面
gl.glCullFace(GL10.GL_FRONT);
//底面
ByteBuffer bIbb=BufferUtil.list2ByteBuffer(bottomList);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, bIbb);
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, bottomList.size()/3);
}
private void redColor(List<Float> colorList){
colorList.add(1f);//r
colorList.add(0f);//g
colorList.add(0f);//b
colorList.add(1f);//a
}
private void yellowColor(List<Float> colorList){
colorList.add(1f);//r
colorList.add(1f);//g
colorList.add(0f);//b
colorList.add(1f);//a
}
private void whiteColor(List<Float> colorList){
colorList.add(1f);//r
colorList.add(1f);//g
colorList.add(1f);//b
colorList.add(1f);//a
}
}


3、运行效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android OpenGL ES