鍍金池/ 教程/ Android/ 設置光照效果 Set Lighting
                                          繪制線段 Line Segment
                                          投影變換 Projection
                                          繪制迷你太陽系
                                          繪制一個球體
                                          繪制三角形 Triangle
                                          OpenGL 光照模型
                                          三維坐標系及坐標變換初步
                                          定義 3D 模型的前面和后面
                                          繪制一個 20 面體
                                          顏色 Color
                                          Depth Buffer
                                          材質及光照示例
                                          基本幾何圖形定義
                                          關于EGL
                                          導言
                                          Viewing 和 Modeling(MODELVIEW) 變換
                                          FrameBuffer
                                          設置光照效果 Set Lighting
                                          Viewport 變換
                                          階段小結
                                          繪制點 Point
                                          OpenGL ES API 命名習慣
                                          通用的矩陣變換指令
                                          關于 OpenGL ES
                                          創建實例應用 OpenGLDemos 程序框架
                                          OpenGL ES 管道(Pipeline)
                                          GLSurfaceView

                                          設置光照效果 Set Lighting

                                          上一篇簡單介紹了 OpenGL 中使用的光照模型,本篇結合 OpenGL ES API 說明如何使用光照效果:

                                          • 設置光源
                                          • 定義法線
                                          • 設置物體材料光學屬性

                                          光源

                                          OpenGL ES 中可以最多同時使用八個光源,分別使用0到7表示。

                                          OpenGL ES光源可以分為

                                          • 平行光源(Parallel light source), 代表由位于無限遠處均勻發光體,太陽可以近似控制平行光源。
                                          • 點光源(Spot light source)如燈泡就是一個點光源,發出的光可以指向360度,可以為點光源設置光衰減屬性(attenuation)或者讓點光源只能射向某個方向(如射燈)。
                                          • 可以為圖形的不同部分設置不同的光源。

                                          下面方法可以打開某個光源,使用光源首先要開光源的總開關:

                                          gl.glEnable(GL10.GL_LIGHTING);

                                          然后可以再打開某個光源如0號光源:

                                          gl.glEnable(GL10.GL_LIGHTI0);

                                          設置光源方法如下:

                                          • public void glLightfv(int light,int pname, FloatBuffer params)
                                          • public void glLightfv(int light,int pname,float[] params,int offset)
                                          • public void glLightf(int light,int pname,float param)
                                          • light 指光源的序號,OpenGL ES可以設置從0到7共八個光源。
                                          • pname: 光源參數名稱,可以有如下:GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION, GL_AMBIENT, GL_DIFFUSE,GL_SPECULAR, GL_SPOT_DIRECTION, GL_POSITION
                                          • params 參數的值(數組或是Buffer類型)。

                                          其中為光源設置顏色的參數類型為 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)
                                          • type 為Buffer 的類型,可以為GL_BYTE, GL_SHORT, GL_FIXED,或 GL_FLOAT
                                          • stride: 每個參數之間的間隔,通常為0.
                                          • 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)的反光屬性(顏色和材質)并給出一個光照的示例。

                                          人妻精品动漫h无码中字