OpenGL ES 光照

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值