• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            羅朝輝(飄飄白云)

            關(guān)注嵌入式操作系統(tǒng),移動(dòng)平臺(tái),圖形開發(fā)。-->加微博 ^_^

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              85 隨筆 :: 0 文章 :: 169 評(píng)論 :: 0 Trackbacks

            Per Pixel Lighting Techniques
                     飄飄白云譯  2008-03-22

            原文鏈接:http://www.nitrogen.za.org/viewtutorial.asp?id=5

            這個(gè)教程用到了向量數(shù)學(xué)知識(shí),如果你對(duì)向量數(shù)學(xué)還不是很了解,請(qǐng)先閱讀向量教程:read the tutorial

            光照與物體表面的相互作用可以通過將一些數(shù)學(xué)公式應(yīng)用于基于per pixel(區(qū)別于基于頂點(diǎn))的著色,從而模擬出真實(shí)生活中的各種材質(zhì)效果。比如浮雕效果,波浪效果,油漆效果等。

            在這個(gè)教程中,我們有如下假定:

            第一,我們討論的是基于像素著色(per-pixel basis),每個(gè)pixel有它自己的位置向量,法線向量以及表面顏色(Surface color,在這里可以是來自紋理的顏色,也可以是RGB顏色(flat color));

            第二,表面顏色Surface color)通常是由R,G,B三部分組成,在這個(gè)教程中,我們把它當(dāng)作一個(gè)向量看待;

            第三,輸入表面顏色(光照處理前的表面顏色,這里的“輸入”可以理解為函數(shù)的輸入?yún)?shù)的“輸入”)只是普通的顏色(單純的紋理顏色或者RGB顏色),而輸出表面顏色(光照處理后的表面顏色)是光照作用于表面的合成顏色,如可以是有陰影,高光等效果的顏色。

            第四,這個(gè)教程中假設(shè)每個(gè)場(chǎng)景中只有一個(gè)燈光。對(duì)于多燈光的場(chǎng)合,對(duì)每一個(gè)燈光循環(huán)進(jìn)行這些運(yùn)算(環(huán)境光除外)。

             

            好了,讓我們開始講解各種光照的算法原理

             

            Ambient Lighting 環(huán)境光

             

            在真實(shí)生活里,有光線的房子里的物體不會(huì)是全黑的,總有一些光量子照亮物體表面,即使這個(gè)表面是背對(duì)光源的,這就是環(huán)境光的原因。我們不考慮環(huán)境光的照射方向,我們總認(rèn)為場(chǎng)景中的物體,不論它在什么位置,總會(huì)受到一定數(shù)量的環(huán)境光照射(全局照明)。環(huán)境光照算法如下:

             

            Inputs:

                   Col – 物體原表面顏色

                    AmbAmount – 場(chǎng)景中環(huán)境光的強(qiáng)弱程度 (介于0 1之間)

                 Outputs:

                    SurfaceColor – 環(huán)境光照作用之后的表面顏色

                    SurfaceColor = Col*AmbAmount;

             

            環(huán)境光照效果圖:

             

            Lambert Shading (郎伯特著色,郎伯特:物理上的亮度單位,在這里就是漫射光作用)

             

            現(xiàn)在我們真正開始考慮一束光照射在物體表面上的作用過程,我們使用最常見的光照算法-------漫反射光照著色或者說郎伯特余弦定律或郎伯特著色(三個(gè)都一回事),這個(gè)算法是將入射光與表面法線向量的點(diǎn)積當(dāng)作漫反射光照強(qiáng)度因子,下面我們看看環(huán)境光照與漫射光照共同作用的算法:

             

            Inputs:

                    LCol – 照射在表面上的漫射光

                    Pos – 表面上被照射的位置

                    LPos – 漫射光源的位置

                    N -表面上被照射的位置處的法向量

                    Col –物體原表面顏色

                    AmbAmount -場(chǎng)景中環(huán)境光的強(qiáng)弱程度 (0 to 1)

            Outputs:

                    SurfaceColor -環(huán)境光照與漫射光照共同作用之后的表面顏色

             

                    VectorToLight = Normalise(LPos - Pos);

                    DiffuseFactor = Dot(VectorToLight, Normal); //DiffuseFactor ranges from 0 to 1

            //光線與表面法線夾角大于90度,想像下光線在表面背面射過來,正表面肯定沒有光照

               if(DiffuseFactor < 0)

                    then DiffuseFactor = 0;

             

                    //環(huán)境光照與漫射光照共同作用

                SurfaceColor = Col*AmbAmount + Col*DiffuseFactor*LCol;

             

            環(huán)境光與漫射光共同作用效果

             

            Specular Highlights鏡面高光

            現(xiàn)在我們考慮物體表面有光澤的效果,這種效果是將Phong反射模型,結(jié)合前面兩個(gè)光照作用而成。這中光照效果計(jì)算需要知道觀察者在場(chǎng)景中的位置,而先前的環(huán)境光照與漫射光照效果計(jì)算都與觀察者所在位置無關(guān)的。

            這種光照計(jì)算是這樣的,首先我們計(jì)算入射光在表面處的反射光線,然后再將反射光線與視線(觀察者的眼睛與表面觀察點(diǎn)的連線)之間的點(diǎn)積值當(dāng)作反射到觀察者眼中的光照強(qiáng)度因子,因?yàn)楸砻嫔细吡恋牟糠质欠瓷涔饩€反射到觀察者眼睛或照相機(jī)中較多的地方,這些地方的反射光線與視線之間的夾角非常小,點(diǎn)積值就越大。

             

            Inputs:

                    ViewPos – 觀察者的位置

                    SpecAmount – 鏡面光強(qiáng)弱. (from 0 to about 200)

                    SpecCol – 鏡面光顏色(通常為白色).

             

                    LCol – 照射在表面上的漫射光

                    Pos – 表面上被照射的位置

                    LPos – 漫射光源的位置

                    N -表面上被照射的位置處的法向量

                    Col –物體原表面顏色

                    AmbAmount -場(chǎng)景中環(huán)境光的強(qiáng)弱程度 (0 to 1)

             

            Outputs:

                    SurfaceColor -環(huán)境光照,漫射光照與鏡面光共同作用之后的表面顏色

                    

                    DiffuseFactor = ... //經(jīng)前兩個(gè)光照作用得來的顏色

                   

                    DirectionToViewer = Normalise(ViewPos - Pos);

                    VectorToLight = Normalise(LPos - Pos);

                    //計(jì)算反射光

                    ReflectanceRay = 2 * Dot(N, VectorToLight) * N - VectorToLight;

               

                //計(jì)算鏡面光照因子. 數(shù)學(xué)公式 SpecFac = (R dot N)^Spec

                SpecularFactor = Pow(Dot(ReflectanceRay, DirectionToViewer), SpecAmount);

               

                    //環(huán)境光照,漫射光照與鏡面光共同作用

                SurfaceColor = Col*AmbFactor + Col*DiffuseFactor*LCol + SpecCol*SpecularFactor;

            環(huán)境光照,漫射光照與鏡面光共同作用

             

            Note:可以在一個(gè)場(chǎng)景中使用多個(gè)漫射光照與鏡面光作用

            Fresnel Term 菲涅爾準(zhǔn)則

            菲涅爾效果是根據(jù)觀察者的觀察表面來調(diào)整反射率來實(shí)現(xiàn)的。比如你從水面,油漆表面或者絲綢的正上方看,反射光澤的柔和效果基本沒有,如果側(cè)著或平著看的話,反射光澤的柔和效果就很明顯,這就是菲涅爾效果。我們簡(jiǎn)單地通過點(diǎn)積操作計(jì)算表明法線與視線之間夾角的余弦值,再將這個(gè)值加權(quán)。對(duì)于較平滑表面,加權(quán)系數(shù)設(shè)置在1.0-5.0之間(油漆效果,絲綢等),對(duì)于比較凹凸的表面,加權(quán)系數(shù)設(shè)置為8.0或更高(水波,液體等)

             

            Inputs:

                    ViewPos – 觀察者的位置

                    FresAmount – 邊緣或表面的尖銳程度. (油漆絲綢:1,液體: 2-8)

                    FresCol - frenel 反射光 (通常使用reflection map or 類似的東西).

             

                    LCol – 照射在表面上的漫射光

                    Pos – 表面上被照射的位置

                    LPos – 漫射光源的位置

                    N -表面上被照射的位置處的法向量

                    Col –物體原表面顏色

                    AmbAmount -場(chǎng)景中環(huán)境光的強(qiáng)弱程度 (0 to 1)

             

            Outputs:

                    SurfaceColor -環(huán)境光照,漫射光照與鏡面光,菲涅爾反射共同作用之后的表面顏色

                    

                    DiffuseFactor = ... //環(huán)境光照,漫射光照作用得來的顏色

                    SpecularFactor = ... //鏡面高光作用得來的顏色

             

                    DirectionToViewer = Normalise(ViewPos - Pos);

                    //計(jì)算fresnel因子. 我們計(jì)算視線與表面法向量間夾角的余弦值([-1..1]之間),然后加一,移動(dòng)到區(qū)間[0..2],然后再加權(quán)。

                    FresnelTerm = Pow(Dot(N, DirectionToViewer)+1, FresAmount);

               

                    //確保因子的在正常范圍內(nèi)

                    if (FresnelTerm > 1)

                           then FresnelTerm = 1; 

                //無菲涅爾反射的場(chǎng)合: Ambient light, Diffuse Light and Specular Light

                     NonReflective = Col*AmbFactor + Col*DiffuseFactor*LCol + SpecCol*SpecularFactor;

             

                    Reflective = FresCol;

                    //環(huán)境光照,漫射光照與鏡面光,菲涅爾反射共同作用

                SurfaceColor = NonReflective*(1-FresnelTerm) + Reflective*FresnelTerm;

             

                           

            漫射無菲涅爾反射時(shí)效果                    漫射有菲涅爾反射時(shí)效果

            posted on 2008-03-30 15:58 羅朝輝 閱讀(2047) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 計(jì)算機(jī)圖形學(xué)

            評(píng)論

            # re: 【譯】各種光照的算法原理 2008-05-19 10:58 smeagol
            = Pow(Dot(N, DirectionToViewer)+1, FresAmount);
            如果是正面那么N 和 DirectionToViewer不可能是負(fù) 那么FresnelTerm 老是大于2 所以最終老是1 這樣結(jié)果對(duì)嗎?
              回復(fù)  更多評(píng)論
              

            国产ww久久久久久久久久| 亚洲AV日韩AV天堂久久| 久久天堂电影网| 久久国产视频99电影| 一本久久a久久精品vr综合| 色婷婷噜噜久久国产精品12p| 久久精品国产亚洲精品| 久久精品一本到99热免费| 国产精品9999久久久久| 久久露脸国产精品| 国产精品久久99| 久久久久久久久波多野高潮| 国内精品久久久久久野外| 久久精品中文字幕大胸| 久久99精品久久久久久hb无码 | 天天久久狠狠色综合| 亚洲人成无码网站久久99热国产| 久久久久无码精品国产不卡| 色综合合久久天天给综看| 久久中文娱乐网| 国产成年无码久久久久毛片| 免费无码国产欧美久久18| 国产精品无码久久久久| 99精品国产在热久久无毒不卡| 亚洲国产一成久久精品国产成人综合 | 久久久久亚洲AV片无码下载蜜桃| 久久无码精品一区二区三区| 精品人妻久久久久久888| 一本色道久久88精品综合| 无码任你躁久久久久久老妇| 国产999精品久久久久久| 91久久精品国产成人久久| 国内精品伊人久久久久av一坑| 国内精品久久久久久久久电影网| 日韩中文久久| 中文精品99久久国产| 国产精品中文久久久久久久| 久久这里的只有是精品23| 一级a性色生活片久久无| 亚洲人成网站999久久久综合| 久久婷婷是五月综合色狠狠|