上一篇簡單介紹了 OpenGL 中使用的光照模型,本篇結合 OpenGL ES API 說明如何使用光照效果:
OpenGL ES 中可以最多同時使用八個光源,分別使用0到7表示。
OpenGL ES光源可以分為
下面方法可以打開某個光源,使用光源首先要開光源的總開關:
gl.glEnable(GL10.GL_LIGHTING);
然后可以再打開某個光源如0號光源:
gl.glEnable(GL10.GL_LIGHTI0);
設置光源方法如下:
其中為光源設置顏色的參數類型為 GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR,可以分別指定R,G,B,A 的值。
指定光源的位置的參數為 GL_POSITION,值為(x,y,z,w):
平行光將 w 設為0.0,(x,y,z)為平行光的方向:
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/96.png" alt="" />
對于點光源,將 w 設成非0值,通常設為1.0. (x,y,z)為點光源的坐標位置。
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/97.png" alt="" />
將點光源設置成聚光燈,需要同時設置 GL_SPOT_DIRECTION,GL_SPOT_CUTOFF 等參數,GL_POSITION的設置和點光源類似:將 w 設成非0值,通常設為1.0. (x,y,z)為點光源的坐標位置。而對于GL_SPOT_DIRECTION 參數,設置聚光的方向(x,y,z)
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/98.png" alt="" />
GL_SPOT_CUTOFF 參數設置聚光等發散角度(0到90度)
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/99.png" alt="" />
GL_SPOT_EXPONENT 給出了聚光燈光源匯聚光的程度,值越大,則聚光區域越?。ň酃饽芰Ω鼜姡?。
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/100.png" alt="" />
對應點光源(包括聚光燈),其它幾個參數 GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION 為點光源設置光線衰減參數,公式有如下形式,一般無需詳細了解:
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/101.png" alt="" />
在場景中設置好光源后,下一步要為所繪制的圖形設置法線(Normal),只有設置了法線,光源才能在所會物體上出現光照效果。三維平面的法線是垂直于該平面的三維向量。曲面在某點P處的法線為垂直于該點切平面的向量
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/102.png" alt="" />
和設置顏色類似,有兩個方法可以為平面設置法線,一是
public void glNormal3f(float nx,float ny,float nz)
這個方法為后續所有平面設置同樣的方向,直到重新設置新的法線為止。
為某個頂點設置法線:
public void glNormalPointer(int type,int stride, Buffer pointer)
打開法線數組
gl.glEnableClientState(GL10.GL\_NORMAL\_ARRAY);
用法和 Color, Vertex 類似。參見 Android OpenGL ES 開發教程(8):基本幾何圖形定義。
規范化法向量,比如使用坐標變換(縮放),如果三個方向縮放比例不同的話,頂點或是平面的法線可能就有變好,此時需要打開規范化法線設置:
gl.glEnable(GL10.GL\_NORMALIZE);
經過規范化后法向量為單位向量(長度為1)。同時可以打開縮放法線設置
gl.glEnable(GL10.GL\_RESCALE\_NORMAL);
設置好法線后,需要設置物體表面材料(Material)的反光屬性(顏色和材質)。
將在下篇介紹設置物體表面材料(Material)的反光屬性(顏色和材質)并給出一個光照的示例。