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

            麒麟子

            ~~

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            Reflect & Refract (以水渲染為例)

             

            我不是Shader帝,雖然知道Shader怎么寫,但一直沒仔細研究過。最近蛋疼至極,研究了下RenderMonkey,于是抽著幾個看著比較有趣的效果做了一下。

             

            先前的模型貼花http://m.shnenglu.com/Leaf/archive/2011/01/07/138093.html

            和CUBE MAP http://m.shnenglu.com/Leaf/archive/2011/01/07/138106.html

            就是此次蛋疼期的產物之一。

             

            還是先圍觀,上圖再說

            image

             

            image

            本次要蛋疼的是折射和反射。

            反射和折射通常用于增加場景真實感。由于其代價昂貴(通常是要將場景多渲染兩次為代價)。因此在實際的游戲開發中,都省著用。而此次演示的水的反射和折射并未進行場景渲染,只做了以下幾點工作。

             

            1、渲染天空球。

            2、渲染一個水面,并用CUBEMAP對其進行映射,映射時紋理坐標采用投影方式,并附帶擾動。(擾動用的是一個立方體紋理)

             

            附加說明:此次是對RenderMonkey 1.82里的Reflections Refractions例子里的Ocean進行改造。 原本Ocean里只做了反射,我強加上了折射。

            關于折射,有一個哥們的資料解釋得挺好的。鏈接如下

            http://www.zwqxin.com/archives/shaderglsl/review-reflect-and-refract.html

             

             

            下面是Vertex Shader代碼。以及其解釋

            float4x4 view_proj_matrix;//: register(c0);
            float4 scale;//: register(c5);
            float4 view_position;
            struct VS_OUTPUT {
               float4 Pos:    POSITION;
               float3 pos:    TEXCOORD0;
               float3 normal: TEXCOORD1;
               float3 vVec:   TEXCOORD2;
            };

            VS_OUTPUT main(float4 Pos: POSITION, float3 normal: NORMAL){
               VS_OUTPUT Out;

               // Get some size on the water
               Pos.xy *= 1000; //由于RenderMonkey里的OceanSurface.3ds比較小,這里進行了強制縮放,若是其它模型,則可以屏蔽掉這兩條語句
               Pos.z = Pos.z -30;

               Out.Pos = mul(Pos,view_proj_matrix);
               Out.pos = Pos.xyz * scale;
               Out.vVec = Pos - view_position;//視線方向 注意:是世界空間。
               Out.normal = normal;

               return Out;
            }

             

             

            float waveSpeed: register(c2); //水波速度  0.3
            float noiseSpeed: register(c3);//躁聲速度 0.26
            float fadeBias: register(c4);//退化矯正 0.3
            float fadeExp: register(c5); //退化幕 6.08
            float time_0_X: register(c0);//時間
            float4 waterColor: register(c1);//水面顏色
            float4 scale: register(c6);//縮放, 其w分量存放著折射系數
            sampler Noise: register(s0);//3D躁聲圖
            sampler skyBox: register(s1);//CUBE MAP  天空盒
            float4 main(float3 pos: TEXCOORD0, float3 normal: TEXCOORD1, float3 vVec: TEXCOORD2) : COLOR {

            //這兩條語句是對其進行偏移,使訪問紋理坐標的時候,產生流動和擾動效果
               pos.x += waveSpeed  * time_0_X;
               pos.z += noiseSpeed * time_0_X;

               float4 noisy = tex3D(Noise, pos); //對躁聲紋理進行采樣

               // Signed noise
               float3 bump = 2 * noisy - 1; //由于采樣同來的躁聲紋理每個分量的值是 [0,1] 對此將其規范化到[-1.0,1.0]
               bump.xy *= 0.15;//縮放一定值。
               // Make sure the normal always points upwards

            ///法向量矯正,使其永遠向上。注:在這里,XY與Ocean平面平行,Z為向上
               bump.z = 0.8 * abs(bump.z) + 0.2;
               // Offset the surface normal with the bump

            //偏移法向量
               bump = normalize(normal + bump);

               // Find the reflection vector

            //計算反射和折射
               float3 reflVec = reflect(vVec, bump);
               float3 refrac = refract(normalize(vVec),normalize(bump),scale.w);

            //根據反射和折射方向訪問CUBE MAP

               float4 refl = texCUBE(skyBox, reflVec.yzx);
               float4 wa = texCUBE(skyBox, refrac.yzx);
               wa = wa*0.5+waterColor*0.5;

            //下面是fresnel效果計算,就是用于計算折射和反射圖之間的插值因子的。詳情請仔細GOOGLE

              //這就是上面那個老兄的Ratio = f + (1 - f) (1 - InVec • norm)fresnelPower 公式

            //圖1中,n1 = 1.0    n2 = 1.3
               float f = 0.0170132325;
               float lrp =f+(1-f)*(1 - dot(-normalize(vVec), bump));
               // Interpolate between the water color and reflection
               return lerp(wa, refl, saturate(fadeBias + pow(lrp, fadeExp)));

            image圖1

             

             

            本文并未解釋任何事情,僅是將上面那個鏈接指向的文章內容翻版為水面實現。此實現僅作為探索目的,無任何實用價值(除非你只想演示水)。

             

            若要用此方案作實時的水面渲染,則需要將場景渲染到一個CUBEMAP上(就算你降到CUBEMAP每秒更新2次,代價也是比較大的,并且不能保證實時感)。

             

            而其中的擾動紋理,以及所給的相關因子均需要手動調整到一個合適的值。

            posted on 2011-01-08 22:35 麒麟子 閱讀(2727) 評論(1)  編輯 收藏 引用 所屬分類: GPU and Graphic

            評論

            # re: Reflect &amp; Refract (以水渲染為例) 2011-01-10 16:20 Rambler

            reflVec.yzx 關于這個掩碼,我的解釋是?!M里的模型太不規范了。  回復  更多評論   

            久久久国产精品亚洲一区| 久久精品国产男包| 99蜜桃臀久久久欧美精品网站| 韩国三级中文字幕hd久久精品 | 国内精品久久久久久久久电影网| 99精品伊人久久久大香线蕉| 久久ZYZ资源站无码中文动漫| 亚洲日本va中文字幕久久| 久久九九兔免费精品6| 久久人与动人物a级毛片| 久久精品中文无码资源站| 久久精品中文字幕一区| 中文无码久久精品| 九九精品99久久久香蕉| 久久亚洲精品中文字幕三区| 91精品国产91热久久久久福利 | 国产色综合久久无码有码| 久久国产欧美日韩精品| 久久久久久久久久久久中文字幕| 国产精品久久久久久福利漫画| 国产国产成人精品久久| 久久国产视频99电影| 久久AV无码精品人妻糸列| 97久久天天综合色天天综合色hd| 91久久九九无码成人网站| 中文字幕无码久久精品青草| 久久精品国产色蜜蜜麻豆| 中文字幕无码av激情不卡久久 | 亚洲成色www久久网站夜月| 99久久精品国内| 亚洲七七久久精品中文国产| 久久久久女人精品毛片| 久久99精品久久久久久水蜜桃| 亚洲天堂久久久| 久久电影网2021| 亚洲人成无码网站久久99热国产 | 成人久久综合网| 免费无码国产欧美久久18| 久久99精品国产麻豆| 亚洲精品无码久久久| 久久久久久综合一区中文字幕|