<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [OpenGL ES 07-1]光照原理

      [OpenGL ES 07-1]光照原理

      羅朝輝 (http://www.rzrgm.cn/kesalin/)

      本文遵循“署名-非商業(yè)用途-保持一致”創(chuàng)作公用協(xié)議

       

      這是《OpenGL ES 教程》的第七篇,前六篇請參考如下鏈接:

      [OpenGL ES 01]iOS上OpenGL ES之初體驗
      [OpenGL ES 02]OpenGL ES渲染管線與著色器
      [OpenGL ES 03]3D變換:模型,視圖,投影與Viewport
      [OpenGL ES 04]3D變換實踐篇:平移,旋轉(zhuǎn),縮放
      [OpenGL ES 05]相對空間變換及顏色
      [OpenGL ES 06]使用VBO:頂點緩存

       

      前言

      在前文《[OpenGL ES 05]相對空間變換及顏色》中講到人的眼睛捕捉色彩的過程:在光照的作用下,物體表面反射不同頻率的光子到人的眼睛中刺激感光細胞從而形成視覺。在那一篇文章中,演示了如何使用顏色,但沒有提及光照,在接下來的文章中,我將來詳細介紹光的特性,物體的材質(zhì)屬性,光照原理以及在 OpenGL ES 2.0中的應(yīng)用示例。

       

      一,光照的基本概念

      運行 OpenGL 程序在屏幕上顯示的最終顏色,受場景中光線的特性以及物體反射和吸收光的屬性(即材質(zhì))影響。光線可能來自特定的位置與方向,也可能是散布在整個場景中(環(huán)境光);而物體表面能夠吸收,反射光線,有些物體本身還能夠發(fā)射光線,物體的這些屬性被稱為材質(zhì)。在 OpenGL 中,物體的材質(zhì)屬性通過反射不同方向的環(huán)境光,漫反射光,鏡面光的RGB顏色來表示的。光照計算就是將發(fā)射光,泛射光,漫反射光以及鏡面高光四個成分分別計算,然后再累加起來。

      光特性

      發(fā)射光(emission):由物體自身發(fā)射的光。如果物體本身不發(fā)光,則無此屬性;

      環(huán)境光(ambient):就是哪些在環(huán)境中進行了充分散射的光,而無法分辨其方向的光。光線在物體表面上向各個方向上均勻泛射,場景中的物體都會泛射光,這些泛射光又會照射到其他物體上繼續(xù)被泛射,直到光子能量耗盡為止,這樣整個場景中散布著這樣的泛射光。在編程時,可通過設(shè)置一個顏色常量來表示環(huán)境光或使用 ambient occlusion map (環(huán)境閉包貼圖)來處理環(huán)境光。在 OpenGL 中,全局環(huán)境光的強度為 (0.2, 0.2, 0.2, 1.0),這弱弱的白色全局環(huán)境光確保即使沒有額外的光源,場景中的物體依然是可見的。

      漫反射光(diffuse):光線來自某個方向,但在物體表面上向各個方向上反射,無論在何處觀察,散射光看上去亮度都相同。我們之所以能看到物體,就是因為物體將入射的光然后向各個方向反射(所以稱之為漫反射)。物體的漫反射材質(zhì)屬性對物體的顏色起著決定性作用。

      鏡面高光(specular):光線來自一個特定的方向,然后在物體表面上以一個特定的方向反射出去(鏡面反射)。正是由于鏡面高光讓物體看起來有光澤,如臺球,金屬表面的光澤。鏡面反射與物體的鏡面反射材質(zhì)屬性有很大關(guān)系,如金屬表面能產(chǎn)生很高的鏡面發(fā)射,而地毯幾乎沒有鏡面反射。在 OpenGL 中,鏡面光的強度可通過光澤度(shininess)來調(diào)節(jié)。

      材質(zhì)屬性

      物體的材質(zhì)屬性取決于物體反射的紅綠藍光的比例。與光源的特性相似,材質(zhì)也分為泛射材質(zhì),漫反射材質(zhì),鏡面材質(zhì)和反射材質(zhì),分別表示反射相應(yīng)類型光的反射率。

      泛射材質(zhì):環(huán)境光的反射率影響物體的整體顏色,因為直射到物體上的漫反射光最亮,而沒有被直射的物體的環(huán)境反射光最明顯。一個物體的泛射光反射率受全局環(huán)境光和來自光源的環(huán)境光的雙重影響。泛射光的反射率不受觀察點點位置的影響。

      漫反射材質(zhì):射的反射率對物體的顏色起著最重要的作用,它受入射的漫反射光顏色以及入射光與法線的夾角的影響,而不受觀察點位置的影響。

      鏡面反射材質(zhì):表面較為光潔的物體由于反射光線而會產(chǎn)生亮斑(看起來有光澤),在這種亮斑被稱為鏡面反射光。在 OpenGL 中物體對光的鏡面反射材質(zhì)屬性決定了光澤的顏色、大小和亮度。鏡面反射光的強度還取決于觀察點的位置,當觀察點正好處于入射光的反射光線上,亮斑的亮度到達最大值。

      發(fā)射材質(zhì):前面提到的三種材質(zhì)都是被動地反射來自外界的光線,而有些物體本身可以發(fā)射光。在 OpenGL 中是通過給物體設(shè)置發(fā)射材質(zhì)顏色來模擬的,物體表面的發(fā)射顏色可以增加物體的強度,但不受任何光源的影響。此外,在整個場景中,發(fā)射光并沒有被當作一種額外的光照。

       

      二,光照的計算

      前面說了,光照效果是由發(fā)射光,環(huán)境光,漫反射光以及鏡面高光四部分組成,這四部分各自獨立計算,然后再累加起來得到最終的光照效果。下面就來詳細介紹這些組成部分是如何計算的。

      發(fā)射光計算

      前面說過,在 OpenGL 中是給物體材質(zhì)設(shè)置發(fā)射顏色來模擬發(fā)射光的,因此它的計算非常簡單:

      發(fā)射顏色 = 物體的發(fā)射材質(zhì)顏色

      環(huán)境光計算

      前面說到,一般我們是設(shè)置一個顏色常量來表示環(huán)境光(或來自 ambient occlusion map),因此環(huán)境光的計算也是很簡單的。

      環(huán)境顏色 = 光源的環(huán)境光顏色 × 物體的環(huán)境材質(zhì)顏色

      漫反射光計算

      漫反射如下圖所示:

      diffuse_light

      漫反射顏色 = 光源的漫反射光顏色 × 物體的漫反射材質(zhì)顏色 × DiffuseFactor

      其中漫反射因子 DiffuseFactor 是光線與頂點法線向量的點積:

      DiffuseFactor = max(0, dot(N, L))

      在圖形學中,點積幾何意義其實就是表示兩個向量之間夾角的 cos 值。因此這個公式直觀地揭示了漫反射的規(guī)律:頂點法線正對入射光線,漫反射效果最強,頂點法線背對入射光線(角度大于等于90度)就完全沒有漫反射效果。

      注意:在光照計算中,頂點法線必須是經(jīng)過規(guī)范化的(normalize)。

      我們可以設(shè)置一個顏色常量來表示漫反射材質(zhì)顏色,來得到平滑顏色的表面。但有些物體表面是很粗糙的,如裂縫,隆起,刮痕等。為了獲得這樣的粗糙表面效果,可以使用 displaced polygon 技術(shù),但這需要大量的計算,效率低下。另外一種更為高效的方式就是使用凹凸貼圖(bump map)。凹凸貼圖就是一種紋理,其內(nèi)容包含編碼在RGB顏色空間中的經(jīng)過擾動的頂點法線。在使用凹凸貼圖進行漫反射計算時時,首先和前面一樣用正常法線計算出 NormalDiffuseFactor,再根據(jù)擾動的頂點法線計算出 PerturbedDiffuseFactor,然后將兩者相乘作為最終的 DiffuseFactor。如下圖所示:

      普通漫反射 凹凸貼圖
      diffuse diffuse_bump_map

       

      鏡面反射

      鏡面反射如下圖所示:

      specular_theroy

      鏡面反射顏色 = 光源的鏡面光顏色 × 物體的鏡面材質(zhì)顏色 × SpecularFactor

      SpecularFactor = power(max(0, dot(N, H)), shininess)

      H = normalise(L + E)

      與漫反射不同,鏡面反射受觀察者的位置影響,這一點在上面的計算公式中可以清楚地看出來。H 向量是視線向量 E 與光線向量 L 的半向量(注意:它經(jīng)過規(guī)劃化的),其幾何意義就是視線與光線夾角的平分線。而 H 和 N 的點積的幾何意義就是說這個平分線與法線的夾角的 cos 值,然后將這個 cos 值進行 shininess 次乘方計算得到最終的鏡面反射因子 Specularfactor。 這里的關(guān)鍵點在于視線與光線的平分線與法線的點積計算上,這表示,當視線與光線在表面處的反射光線夾角(可看成是N與H的夾角)越少時,鏡面反射效果最明顯(角度越小,cos 值越大)

      一般可使用常量顏色作為鏡面材質(zhì)顏色,但這樣得到的效果有時候并不理想。同漫反射一樣,我們也可以使用鏡面貼圖來獲得更好的鏡面反射效果。鏡面貼圖通過控制物體表示上特定像素允許的鏡面反射強度來獲得較為真實的效果。

      普通鏡面反射 鏡面貼圖 鏡面貼圖反射
      specular specular_map_tex specular_map

       

      衰減因子

      光源發(fā)射的光線在其傳播過程中,會與空氣中的其他粒子碰撞,其能量會逐漸衰減。在 OpenGL 中,這是通過將光照強度乘以隨傳播距離變化的衰減因子來模擬實現(xiàn)的。這個衰減因子的計算公式如下:

      衰減因子 = 1.0/(距離衰減常量 + 線性衰減常量 × 距離 + 二次衰減常量 × 距離的平方)

      其中距離衰減常量,線性衰減常量和二次衰減常量均為常量值。

      注意:環(huán)境光,漫反射光和鏡面光的強度都會受隨著距離的增大而衰減,只有發(fā)射光和全局環(huán)境光的強度不會受此影響。

      聚光燈因子

      在這里,我們討論聚光燈的發(fā)射光照計算(也即位置型光源:如臺燈,相對方向性光源:如太陽)。聚光燈就是朝某個特定發(fā)射發(fā)射光線的光源。你可以想象下漆黑的夜晚里,一個手電筒給與你光明的這個場景,手電筒就是一個很好的聚光燈示例。聚光燈的計算分為兩部分:在光線照射角度范圍之外的部分被忽略,只有在照射角度范圍之內(nèi)的部分需要計算。

      聚光燈夾角cos值 = power(max(0, dot(單位光源向量, 單位光線向量)), 聚光燈指數(shù))

      其中單位光線向量是從光源指向頂點的單位向量,聚光燈指數(shù)表示聚光燈的亮度程度。前面說過點積的幾何意義就是表示角度的,這里聚光燈因子就表示光源向量與光線向量之間的夾角。

       

      而為了模擬真實聚光燈光環(huán)效果,在照射角度范圍之內(nèi)與之外的接壤處,設(shè)置一個漸變過渡區(qū)域,以避免光照從有到無巨變:

      無過渡

      有過渡

      spotlight spotlight_falloff

      增加過渡區(qū)之后的計算如下:

      spotlight_falloff_compute

      內(nèi)環(huán)是完全光照的,而過渡區(qū)域(中環(huán))是從完全光照到完全沒有光照的漸變過渡,外環(huán)是完全沒有光照的。

      聚光燈因子 = clamp((外環(huán)的聚光燈角度cos值 - 當前頂點的聚光燈角度cos值)/(外環(huán)的聚光燈角度cos值 - 內(nèi)環(huán)聚光燈角度cos值), 0, 1)

      clamp 函數(shù)是將聚光燈因子限定在[0, 1]之間,這樣,內(nèi)環(huán)是完全光照的,而中環(huán)是從完全光照到?jīng)]有光照的漸變過渡,外環(huán)是沒有光照的。因此:

      聚光燈效果 = 聚光燈光源顏色  × 聚光燈因子

       

      光照計算的終極公式

      光照顏色 = 發(fā)射顏色 + 全局環(huán)境顏色 + (環(huán)境顏色 + 漫反射顏色 + 鏡面反射顏色) × 聚光燈效果 × 衰減因子

      如果場景中有多個光源(包括環(huán)境光),那么分別計算來每個光源的光照顏色,然后把這些光照顏色累加即可。如果物體不發(fā)射光,則沒有發(fā)射顏色這一成分。

       

      三,高洛德著色(Gouraud Shading)與馮氏著色(Phong Shading)

      在圖形渲染中有兩種著色方式,高洛德著色與馮氏著色。高洛德著色也被稱為Per-Vertex著色,它是在頂點著色階段對頂點進行顏色計算,然后在光柵化階段對這些頂點顏色進行線性插值形成片元的顏色;馮氏著色也被稱為Per-Pixel像素著色,它是在片元著色階段對每一個片元(像素)進行顏色計算。無疑,插值的顏色效果沒有針對每一個片元進行顏色計算的效果好(除非你的圖元切分到像素近似大小,不過這樣 GPU 肯定吃不消,計算量巨大!)。

      Gouraud 著色 Phong 著色
      Gauroud Phong

       

      四,結(jié)語

      光照是個很復雜的話題,尤其是多光源,陰影的計算。在這篇文章中,我詳細介紹了不同類型光的性質(zhì)以及物體的材質(zhì)屬性,以及光照計算的過程。這些都是光照的基石,掌握了這些才有可能繼續(xù)攀登高峰。在下一篇文章中,我將演示一個 Gouraud 著色的光照示例。

       

      五,參考

      1. "Lambertian reflectance". Wikipedia

      2. "Phong shading" . Wikipedia.

      3. Devmaster.net. The basics of 3d lighting

      4. OpenGL 編程指南

       

      posted @ 2012-12-29 21:15  飄飄白云  閱讀(5073)  評論(6)    收藏  舉報
      本博客遵循 Creative Commons License “署名-非商業(yè)用途-保持一致”創(chuàng)作共用協(xié)議。 與我聯(lián)系
      主站蜘蛛池模板: 日日躁狠狠躁狠狠爱| 18禁精品一区二区三区| 久久国产精品乱子乱精品| 少妇被粗大的猛进出69影院| 一边吃奶一边做动态图| 精品国产午夜福利在线观看| 亚洲精品一区二区三区综合| 国产成人午夜福利院| 国产精品中文字幕综合| 亚洲十八禁一区二区三区| 午夜免费福利小电影| 亚洲国产色婷婷久久99精品91| 国产尤物精品自在拍视频首页| 内射极品少妇xxxxxhd| 国产精品日日摸夜夜添夜夜添无码 | 亚洲日本一区二区三区在线播放 | 国产精品99久久久久久董美香 | 干老熟女干老穴干老女人| 欧美成本人视频免费播放| 精品人妻av区乱码| 国产av综合影院| 国产在线播放专区av| 亚洲性无码av在线| 亚洲综合在线一区二区三区| 色欲综合久久中文字幕网| 久久99国产精品久久99| 亚洲国产成人久久综合一区77| 欧美亚洲综合成人A∨在线| 亚洲国产美女精品久久久| 国产偷自一区二区三区在线| 人妻无码不卡中文字幕系列| 极品白嫩少妇无套内谢| 五月综合婷婷久久网站| 人妻日韩精品中文字幕| 极品少妇的粉嫩小泬看片| 国产成人高清亚洲综合| 国产精品免费AⅤ片在线观看| 亚洲国产精品一区二区久久| 免费午夜无码片在线观看影院 | 综合色天天久久| 亚洲成人精品综合在线 |