OpenGLES入門(五)

本章實現(xiàn)了自定義光照,地球自轉(zhuǎn),以及月球自轉(zhuǎn)和繞地球公轉(zhuǎn)的模型視圖變換。

代碼中引入了模型文件,sphere.obj,有興趣的可以去了解OpenGLES的模型導入

在代碼開始之前,先介紹一些概念。

1.基礎(chǔ)光照

我們現(xiàn)實中看到的物體,都是眼睛通過接收到的物體表面的反射光形成的。現(xiàn)實生活中的光是非常復雜的,會受到很多因素的影響,這是我們有限的計算能力所無法模擬的。因此OpenGL的光照使用的是簡化的模型,對現(xiàn)實的情況進行近似,這樣處理起來會更容易一些,而且看起來也差不多一樣。這些光照模型都是基于我們對光的物理特性的理解。其中一個模型被稱為馮氏光照模型(Phong Lighting Model)。馮氏光照模型的主要結(jié)構(gòu)由3個分量組成:環(huán)境(Ambient)、漫反射(Diffuse)和鏡面(Specular)光照。下面這張圖展示了這些光照分量看起來的樣子:

環(huán)境光照(Ambient Lighting):即使在黑暗的情況下,世界上通常也仍然有一些光亮(月亮、遠處的光),所以物體幾乎永遠不會是完全黑暗的。為了模擬這個,我們會使用一個環(huán)境光照常量,它永遠會給物體一些顏色。

漫反射光照(Diffuse Lighting):模擬光源對物體的方向性影響(Directional Impact)。它是馮氏光照模型中視覺上最顯著的分量。物體的某一部分越是正對著光源,它就會越亮。

鏡面光照(Specular Lighting):模擬有光澤物體上面出現(xiàn)的亮點。鏡面光照的顏色相比于物體的顏色會更傾向于光的顏色。

OpenGLES給我們提供設置光源的方法,我們可以自定義三種光照的顏色,設定光源的位置,給物體增加光照的效果。其中漫反射光會給我們造成更顯著的視覺效果,在OpenGLES中,所有的漫反射光都是通過每個頂點的法向量計算出來的。這里就不給出計算過程了,想了解計算過程的看這里

2.矩陣堆棧(GLKMatrixStack)

在之前的代碼中,我們已經(jīng)對圖形進行過各種變化。在OpenGLES中,對圖形的變換,本質(zhì)上就是對各個頂點坐標進行矩陣變換,因為頂點坐標也可以看作是一個單列的x,y,z三維向量矩陣。(但是在OpenGL中,通常會使用一個四維向量來計算,w向量,第四個w向量值通常都是是1,因為在3D空間中縮放w分量是無意義的)

為了方便使用矩陣運算,OpenGL提供了GLKMatrixStack來保存4X4矩陣。

1.GLKMatrixStackCreate:創(chuàng)建矩陣堆棧

2.GLKMatrixStackLoadMatrix4:用一個新矩陣替換頂部矩陣,可以用來添加第一個矩陣

3.GLKMatrixStackPush:復制頂部矩陣并添加到堆棧頂部

4.GLKMatrixStackScale:添加縮放矩陣,與頂部矩陣進行運算,得到新的頂部矩陣

5.GLKMatrixStackTranslate:添加位移矩陣,與頂部矩陣進行運算,得到新的頂部矩陣

6.GLKMatrixStackRotate:添加旋轉(zhuǎn)矩陣,與頂部矩陣進行運算,得到新的頂部矩陣

7.GLKMatrixStackGetMatrix4:獲取頂部矩陣,一般是將運算后得到的最終矩陣,設置給模型視圖變換矩陣,對視圖進行變換?

8.GLKMatrixStackPop:對頂部矩陣進行出棧,這樣可以得到我們最開始添加的矩陣,設置給模型視圖,用來進行下一次變換操作。

3.熟悉了上面的基本概念之后,結(jié)合代碼來理解

3.1 sphere.h文件存放了頂點、法線、紋理坐標,用來繪制圖形,紋理樣通過地球、月球2張圖片導入

3.2 這里設置投影方式為透視投影(GLKMatrix4MakeFrustum),符合我們平時看到實際物體樣子

也可以將投影方式設置為正交投影,看看不同投影方式顯示效果的區(qū)別

3.3 設置光源

這里只設置了一個光源,也可以設置多個光源,參照上面的代碼。

3.4 繪制地球和月球

這里主要是矩陣對頂點坐標進行矩陣運算,使用的就是OpenGL提供的矩陣堆棧,我們只需要將變換矩陣傳遞給GLMatrixStack,交給GPU幫我們計算,這里是對地球的頂點坐標進行變換,月球也是相同的步驟,不過需要注意的是,將地球頂點坐標變換完畢以后,需要將模型視圖矩陣設置為初始矩陣,然后再進行月球的矩陣頂點運算。

主要的代碼就是這些,本章使用了AGLKVertexAttribArrayBuffer類,這個類封裝了在圖形繪制時的固定步驟,不用每次都去寫相同的代碼。具體的demo代碼在這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容