OpenGL ES 光照

来源:互联网 发布:淘宝导航代码大全 编辑:程序博客网 时间:2024/05/21 17:10

1、新建 Draw.java 绘制一些图像方法

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};//反射率
运行结果


0 0