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

OpenGL ES 光照

2015-08-13 21:25 218 查看
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};//反射率
运行结果

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