OpenGL ES 颜色缓冲 深度测试 表面剔除
2015-08-02 22:18
351 查看
1、修改MyAbstractRenderer.java 启用颜色缓冲区
2、创建 MyTriangleConeRenderer 类
3、运行效果
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、运行效果
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories