射燈是OpenGL ES中燈光中最耗GPU資源燈光.但其3D效果十分逼真.睇上圖.射燈有多個參數需指定.『位置』『照射方向』『照射角度』小於180度、『衰減指數』小於零,若設為0則亮度不衰減,實制『衰減值』與遊戲3D空間尺寸有關.這裡設為0.01.以及三個光照顏色『環境色』『漫反射色』『鏡面反射色』
public class LightSpot {
private float[] ambient = {1.0f, 1.0f, 1.0f, 1.0f};// 射燈-環境色
private float[] diffuse = {1.0f, 1.0f, 1.0f, 1.0f};// 射燈-漫反射色
private float[] specular = {0.0f, 0.0f, 0.0f, 1.0f};// 射燈-高光顏色
private float[] position = {0.0f, 3.0f, 0.0f, 1.0f};// 射燈-位置
private float[] direction = {0.0f, -1.0f, 0.0f, 0.0f};// 射燈-方向
private float cutoff = 45;// 射燈-角度範圍,缺省為180.0
private float exponent = 0.01f;// 衰減指數,缺省為0.0f
int id = 0;// 光照ID
// 射燈ID 輸入:GL10.GL_LIGHT0至GL10.GL_LIGHT7
LightSpot(int ID){
this.id = ID;
}
//設置射燈方向,轉換為方向向量.最後w分量設0,代表方向
public void setDirection(float x,float y,float z){
direction[0] = x – position[0];
direction[1] = y – position[1];
direction[2] = z – position[2];
direction[3] = 0;
}
// 設定射燈位置.w分量設為1代表位置向量
public void setPosition(float x,float y,float z){
position[0] = x;
position[1] = y;
position[2] = z;
position[3] = 1;
}
// 設定射燈顏色
public void setColor(float r,float g,float b){
ambient[0] = r;
ambient[1] = g;
ambient[2] = b;
ambient[3] = 1;
}
//使能射燈
public void enable(){
GL10 gl = GRAPHICS.gl;
gl.glEnable(id);//使能
gl.glLightfv(id,GL10.GL_AMBIENT, ambient, 0);// 射燈-環境色
gl.glLightfv(id,GL10.GL_DIFFUSE, diffuse, 0);// 射燈-漫反射色
gl.glLightfv(id,GL10.GL_SPECULAR, specular, 0);// 射燈-高光顏色
gl.glLightfv(id,GL10.GL_POSITION, position, 0);// 位置
gl.glLightfv(id,GL10.GL_SPOT_DIRECTION, direction, 0);// 方向
gl.glLightf(id,GL10.GL_SPOT_CUTOFF,cutoff); // 角度範圍
gl.glLightf(id,GL10.GL_SPOT_EXPONENT,exponent);// 衰減指數
}
// 屏蔽射燈
public void disable(){
GL10 gl = GRAPHICS.gl;
gl.glDisable(id);
}
}