《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》——6.5节光照的每顶点计算与每片元计算...
本節(jié)書摘來自異步社區(qū)《OpenGL ES 2.0游戲開發(fā)(上卷):基礎(chǔ)技術(shù)和典型案例》一書中的第6章,第6.5節(jié)光照的每頂點(diǎn)計(jì)算與每片元計(jì)算,作者 吳亞峰,更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“異步社區(qū)”公眾號(hào)查看
6.5 光照的每頂點(diǎn)計(jì)算與每片元計(jì)算
OpenGL ES 2.0游戲開發(fā)(上卷):基礎(chǔ)技術(shù)和典型案例
細(xì)心的讀者會(huì)發(fā)現(xiàn),本章前面的案例都是在頂點(diǎn)著色器中進(jìn)行光照計(jì)算的。這是由于在頂點(diǎn)著色器中對(duì)每個(gè)頂點(diǎn)進(jìn)行光照計(jì)算后得到頂點(diǎn)的最終光照強(qiáng)度,再由管線插值后傳入片元著色器以計(jì)算片元的顏色,這樣一方面效率比較高;另一方面產(chǎn)生的光照效果也不錯(cuò)。
但由于這種計(jì)算方式插值的是基于頂點(diǎn)計(jì)算后的光照強(qiáng)度,因此在要求很高,希望有非常細(xì)膩光照效果的場(chǎng)合下就略顯粗糙了。本節(jié)將介紹另一種光照計(jì)算方式,其首先將插值后的法向量數(shù)據(jù)傳入片元著色器,然后在片元著色器中進(jìn)行光照計(jì)算。這種新的方式也稱為每片元光照,可以取得為更細(xì)膩的光照效果。
進(jìn)行案例開發(fā)之前需要首先了解一下本節(jié)兩個(gè)案例(Sample6_9和Sample6_10)的運(yùn)行效果,具體情況如圖6-21所示。
圖6-21中左側(cè)是每片元計(jì)算一次光照的案例Sample6_9的運(yùn)行效果,右側(cè)是每頂點(diǎn)計(jì)算一次光照的案例Sample6_10的運(yùn)行效果。從兩幅圖的對(duì)比中可以看出,每片元執(zhí)行一次光照使過渡更平滑,沒有明顯的邊緣。另外,僅從圖上觀察可能區(qū)別還不是很明顯,筆者建議讀者用真機(jī)運(yùn)行一下兩個(gè)案例,將光源設(shè)置在不同的位置觀察比較,區(qū)別會(huì)更明顯。
了解了兩個(gè)案例的運(yùn)行效果后,就可以進(jìn)行開發(fā)了。實(shí)際上這兩個(gè)案例主要是將前面6.2.5小節(jié)中的案例Sample6_5復(fù)制并修改了部分代碼而成的。其中Sample6_10僅修改了Java代碼中切割球面的角度以及繪制球體的次數(shù),沒有本質(zhì)變化,這里不再贅述,需要的讀者請(qǐng)參考隨書光盤中的源代碼。
而案例Sample6_9除了也進(jìn)行了Sample6_10的Java代碼改動(dòng)外,還大面積修改了頂點(diǎn)著色器與片元著色器,具體情況如下所列。
(1)首先介紹Sample6_9中修改后的頂點(diǎn)著色器,其具體代碼如下。
1 uniform mat4 uMVPMatrix; //總變換矩陣 2 attribute vec3 aPosition; //頂點(diǎn)位置 3 attribute vec3 aNormal; //法向量 4 varying vec3 vPosition; //用于傳遞給片元著色器的頂點(diǎn)位置 5 varying vec3 vNormal; //用于傳遞給片元著色器的法向量 6 void main(){ 7 gl_Position = uMVPMatrix * vec4(aPosition,1);//根據(jù)總變換矩陣計(jì)算此次繪制此頂點(diǎn)位置 8 vPosition = aPosition; //將頂點(diǎn)的位置傳給片元著色器 9 vNormal = aNormal; //將法向量傳給片元著色器 10 }從上述代碼中可以看出,頂點(diǎn)著色器比改動(dòng)前簡(jiǎn)單多了,沒有了計(jì)算光照的大量代碼,同時(shí)增加了將法向量通過易變變量傳入片元著色器的代碼。
(2)介紹完頂點(diǎn)著色器后,接著就應(yīng)該介紹改動(dòng)后的片元著色器了,其具體代碼如下。
讀者應(yīng)該發(fā)現(xiàn),上述片元著色器中的很多代碼都是本章前面案例中多次出現(xiàn)過的,只不過前面的案例中都是在頂點(diǎn)著色器中出現(xiàn),而這里挪到了片元著色器中。因此,每片元計(jì)算光照與每頂點(diǎn)計(jì)算光照算法并沒有本質(zhì)區(qū)別,只是代碼執(zhí)行的位置不同、效果與效率不同而已。實(shí)際開發(fā)中讀者應(yīng)該權(quán)衡速度、效果的要求,選用合適的計(jì)算策略。
總結(jié)
以上是生活随笔為你收集整理的《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》——6.5节光照的每顶点计算与每片元计算...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDOJ-1257 最少拦截系统
- 下一篇: unity 罗技G29开发