OpenGL ES 光照
2015-08-13 21:25
218 查看
1、新建 Draw.java 绘制一些图像方法
2、BufferUtil.java 添加 arr2FloatBuffer方法
public static FloatBuffer arr2FloatBuffer(float[] arr){
FloatBuffer fbb =FloatBuffer.allocate(arr.length);
fbb.order();
fbb.put(arr);
fbb.position(0);
return fbb;
}
3、新建 MyLightingRenderer1.java
4、由于
反射的只有红光
运行结果
5、设置可以材料反射 红蓝光
public class Draw { /* * 绘制 球 */ static public void drawSphere(GL10 gl,float r,int tiers,int blocks){ float tiersAnger =(float) (Math.PI / tiers); // 一个层的角度差 float blockAngle =(float) ((Math.PI *2) / blocks);// 一个圆每个的角度差 List<Float> pos =new ArrayList<Float>(); for(int i =0;i <tiers; i++){ //一次画两个圆层 float alpha0 =(float) ((-Math.PI/2) +(i *tiersAnger)) ; float alpha1 =(float) ((-Math.PI/2) +((i +1) *tiersAnger)) ; //y 值 float y0 =(float) (Math.sin(alpha0) *r); float y1 =(float) (Math.sin(alpha1) *r); //圆半径 float r0 =Math.abs((float) (Math.cos(alpha0) *r)); float r1 =Math.abs((float) (Math.cos(alpha1) *r)); for(int j=0;j <=blocks; j++){ //圆坐标 float x0 = (float) (Math.cos(j *blockAngle) *r0); float z0 = (float) (Math.sin(j *blockAngle) *r0); float x1 = (float) (Math.cos(j *blockAngle) *r1); float z1 = (float) (Math.sin(j *blockAngle) *r1); pos.add(x0); pos.add(y0); pos.add(z0); pos.add(x1); pos.add(y1); pos.add(z1); } } ByteBuffer pBB =BufferUtil.list2ByteBuffer(pos); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, pBB); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, pos.size()/3); } }
2、BufferUtil.java 添加 arr2FloatBuffer方法
public static FloatBuffer arr2FloatBuffer(float[] arr){
FloatBuffer fbb =FloatBuffer.allocate(arr.length);
fbb.order();
fbb.put(arr);
fbb.position(0);
return fbb;
}
3、新建 MyLightingRenderer1.java
/* * 光照 * openGL分为三种光 * 环境光(全局光 ambient light) * 散射光(diffuse light) * 镜面光(specular light) */ public class MyLightingRenderer1 extends MyAbstractRenderer { public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { //设置清屏色(背景) gl.glClearColor(0, 0, 0, 1); //启用顶点缓冲区 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //启用深度测试 gl.glEnable(GL10.GL_DEPTH_TEST); } protected void drawBefore(GL10 gl) { //清除颜色缓冲区 |深度缓冲区 gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT); } protected void draw(GL10 gl) { //启用光照 gl.glEnable(GL10.GL_LIGHTING); //全局 环境光 //默认值是{0.2 ,0.2 ,0.2 ,1.f} 是非常暗淡 float []global_ambient ={1f ,0f ,1f ,1f}; gl.glLightModelfv(GL10.GL_LIGHT_MODEL_AMBIENT, BufferUtil.arr2FloatBuffer(global_ambient)); // gl.glLightModelfv(GL10.GL_LIGHT_MODEL_AMBIENT, global_ambient, 0); //设置材料属性 float []gray ={1f ,0f ,0f ,1.0f};//反射率 //openGL ES 支持双面 ,openGL 支持 背面、正面、双面 //由于 android 使用的是 openGL ES //正面 背面 双面 //指定 光 //反射率 gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT_AND_DIFFUSE, BufferUtil.arr2FloatBuffer(gray)); gl.glColor4f(1, 0, 0, 1); Draw.drawSphere(gl, 0.4f, 20, 20); } }
4、由于
float []gray ={1f ,0f ,0f ,1.0f};//反射率
反射的只有红光
运行结果
5、设置可以材料反射 红蓝光
float []gray ={1f ,0f ,1f ,1.0f};//反射率运行结果
相关文章推荐
- 使用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