• <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>

            永遠也不完美的程序

            不斷學習,不斷實踐,不斷的重構……

            常用鏈接

            統計

            積分與排名

            好友鏈接

            最新評論

            The Complete Effect and HLSL Guide 函數

            上一章里,我們學習了HLSL主要的語法元素。現在,唯一沒有講解的只剩下函數了,包括如何聲明與定義函數,如何在shader中使用函數。函數是高級語言中的重要組成部分,它在shader中也同樣扮演了重要角色。HLSL語法允許使用兩種類型的函數。內置(或固有)函數為shader提供了一個預定義函數庫,同時也為特定著色構架提供了某些特殊指令。

                   當然,你可以創建自定義函數。自定義函數可以用來把shader組織為一個整體,也可以用來打包部分希望重用的功能。

                   接下來的幾節里,我將會討論兩種類型的函數,在最后還會講解如何用函數定義shader。先來看看HLSL提供的豐富內置函數庫吧。

             

            內置函數

             

                   HLSL著色語言包含了一系列廣泛的,內置,或固有函數。這些函數在開發shader時相當有用。它們提供了從數學計算到紋理采樣等廣泛的功能。先依次瀏覽一下這些函數。

             

            3-1 HLSL內置函數

            函數名            用法

            abs                         計算輸入值的絕對值。

            acos                        返回輸入值反余弦值。

            all                           測試非0值。

            any                         測試輸入值中的任何非零值。

            asin                         返回輸入值的反正弦值。

            atan                        返回輸入值的反正切值。

            atan2                       返回y/x的反正切值。

            ceil                         返回大于或等于輸入值的最小整數。

            clamp                      把輸入值限制在[min, max]范圍內。

            clip                         如果輸入向量中的任何元素小于0,則丟棄當前像素。

            cos                         返回輸入值的余弦。

            cosh                       返回輸入值的雙曲余弦。

            cross                      返回兩個3D向量的叉積。

            ddx                         返回關于屏幕坐標x軸的偏導數。

            ddy                         返回關于屏幕坐標y軸的偏導數。

            degrees                   弧度到角度的轉換

            determinant              返回輸入矩陣的值。

            distance                   返回兩個輸入點間的距離。

            dot                          返回兩個向量的點積。

            exp                         返回以e為底數,輸入值為指數的指數函數值。

            exp2                       返回以2為底數,輸入值為指數的指數函數值。

            faceforward             檢測多邊形是否位于正面。

            floor                       返回小于等于x的最大整數。

            fmod                       返回a / b的浮點余數。

            frac                        返回輸入值的小數部分。

            frexp                       返回輸入值的尾數和指數

            fwidth                     返回 abs ( ddx (x) + abs ( ddy(x))

            isfinite                     如果輸入值為有限值則返回true,否則返回false

            isinf                        如何輸入值為無限的則返回true

            isnan                       如果輸入值為NANQNAN則返回true

            ldexp                       frexp的逆運算,返回 x * 2 ^ exp

            len / lenth                返回輸入向量的長度。

            lerp                         對輸入值進行插值計算。

            lit                            返回光照向量(環境光,漫反射光,鏡面高光,1)。

            log                          返回以e為底的對數。

            log10                      返回以10為底的對數。

            log2                        返回以2為底的對數。

            max                        返回兩個輸入值中較大的一個。

            min                         返回兩個輸入值中較小的一個。

            modf                       把輸入值分解為整數和小數部分。

            mul                         返回輸入矩陣相乘的積。

            normalize                 返回規范化的向量,定義為 x / length(x)

            pow                        返回輸入值的指定次冪。

            radians                    角度到弧度的轉換。

            reflect                     返回入射光線i對表面法線n的反射光線。

            refract                     返回在入射光線i,表面法線n,折射率為eta下的折射光線v

            round                      返回最接近于輸入值的整數。

            rsqrt                       返回輸入值平方根的倒數。

            saturate                   把輸入值限制到[0, 1]之間。

            sign                        計算輸入值的符號。

            sin                          計算輸入值的正弦值。

            sincos                     返回輸入值的正弦和余弦值。

            sinh                        返回x的雙曲正弦。

            smoothstep              返回一個在輸入值之間平穩變化的插值。

            sqrt                         返回輸入值的平方根。

            step                        返回(x >= a? 1 : 0

            tan                          返回輸入值的正切值。

            fanh                        返回輸入值的雙曲線切線。

            transpose                 返回輸入矩陣的轉置。

            tex1D*                    1D紋理查詢。

            tex2D*                    2D紋理查詢。

            tex3D*                    3D紋理查詢。

            texCUBE*                立方紋理查詢。

             

                   為了貼近實際,舉個例子來展示如何使用這些函數吧。假設你需要把紋理映射到一個像素上,并且使用方向光來照亮這個像素。要完成這個任務,必須先計算光源對像素顏色的貢獻,然后查找紋理顏色,最后把這兩個顏色混合起來。首先,為了計算方向光的貢獻,需要計算像素法線和光源方向的點積。使用dot函數可以很方便的完成這一步計算:

             

                   LightIntensity = dot ( LightDirection , PixelNormal);

             

                   這里可能會出現一點小小的問題,如果像素法線背對著光源方向,那么得到的亮度將為負值。必須保證亮度在01之間,以避免這種效果。怎么做呢?很幸運,saturate函數能完成這個任務,修改上面的代碼:

             

                   LightIntensity = saturate ( dot ( LightDirection , PixelNormal ) );

             

                   在把燈光顏色添加到物體上之前,還需要從紋理中獲得像素的顏色。假設像素已經包含了適當的紋理坐標并且有一張簡單的2D紋理,那么紋理采樣的代碼如下:

             

                   PixelColor = tex2D ( objectTexture , TextureCoord ) ;

             

                   最后一步,就是對燈光和像素顏色進行混合。這里,我們需要燈光顏色,燈光亮度以及像素顏色作為參數。計算很簡單,但你應該注意shader構架的矢量天性是如何對顏色中的所有分量同時起作用的。

             

                   FinalColor = ( LightColor * LightIntensity) * PixelColor ;

             

                   這個例子雖然簡單,但是它展示了HLSL的強大威力,僅僅使用三行代碼就能完成簡單的光照。在進入下一個主題之前,需要指出根據完成功能的不同,內建函數可以接收不同的參數。另外,由于硬件性能的不同,部分內建函數并不是在所有頂點和像素著色器版本上都可用。

            posted on 2008-08-08 15:29 狂爛球 閱讀(1696) 評論(0)  編輯 收藏 引用 所屬分類: 圖形編程

            国产69精品久久久久99尤物| 中文字幕日本人妻久久久免费| 久久夜色精品国产噜噜亚洲AV| 亚洲AV无一区二区三区久久| 青青热久久国产久精品 | 久久99热这里只有精品66| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 人妻无码αv中文字幕久久 | 日韩欧美亚洲国产精品字幕久久久| 精品无码人妻久久久久久| 亚洲国产精品无码久久久久久曰| 99精品国产综合久久久久五月天| 久久婷婷国产麻豆91天堂| 麻豆久久久9性大片| 免费国产99久久久香蕉| 午夜精品久久久久成人| AV色综合久久天堂AV色综合在| 免费精品久久久久久中文字幕| 国产精品99久久99久久久| 欧美激情一区二区久久久| 久久99精品久久久久久水蜜桃| 久久久久久九九99精品| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久精品免费全国观看国产| 久久99精品久久久久久| 亚洲αv久久久噜噜噜噜噜| 狠狠色丁香久久婷婷综合蜜芽五月| 91精品婷婷国产综合久久| 东京热TOKYO综合久久精品| 久久精品国产亚洲AV影院| 三级片免费观看久久| 久久国产香蕉视频| 免费国产99久久久香蕉| 久久久久亚洲AV无码麻豆| 少妇久久久久久被弄高潮| 久久精品国产亚洲av麻豆图片 | 久久无码国产专区精品| 日韩va亚洲va欧美va久久| 久久人人爽人人澡人人高潮AV| 精品久久久久中文字幕一区| 精品综合久久久久久88小说|