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

            麒麟子

            ~~

            導航

            <2013年4月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            統計

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            CubeMap視線反射方向計算詳解

            其基本原理很多例子上有講到。下面給出一些比較合適的鏈接

            http://developer.nvidia.com/object/cube_map_ogl_tutorial.html    NVIDIA官網上的 Opengl Cube texture mapping
            http://www.zwqxin.com/archives/shaderglsl/review-cube-mapping-shader.html  某位兄弟的個人BLOG。
            以上兩位都適合OPENGL控。
            本文給出一個DX HLSL例子。并解釋了反射方向計算的數學模型。希望能給大家一定的幫助。
            CUBE映射主要分為兩步:
            一、在VS中根據法線和觀察位置計算反射方向,并且得到觀察空間中的反射方向。
            反射方向有兩種計算方法。
            1、在世界坐標系空間中計算,然后再將計算到的反射方向轉換到觀察空間。 這要求我們轉入觀察位置。
            2、在觀察空間中進行計算,此時觀察位置已經為0,0,0,于是不需要傳入觀察位置,并且得到的向量即為所求。本文的代碼采用此種方式。


            值得說明的一點是。在進行計算時,入射方向和反射方向以及法線方向并未要求一定要單位化。
            二、用這個反射方向在PS中對CUBE紋理進行采樣。

            下面是一個對反射向量計算的通用求解過程。

            我們假設頂點位置為Pos 即點O,視點為Eye 即點A (均為同一坐標系空間)
            那么,我們的觀察方向便是Pos-Eye, 即AO。而我們的反射方向便是OC。 法線為OB或OD方向。
            下面我們來看看反射方向的求法
            而由上圖可知,OC = AD ;
            而又由OA+AD = OD;OD = 2*OB;可得
             OC = 2*OB-OA;
            而OA = Eye-Pos;
            可得,OC = 2*OB-(Eye-Pos);
            那么,最后我們可以看出,只要求出OB,則可以求出OC。
            而從圖上我們可以看到OB即為OA在(法線)OD上的投影。 由此可知, OB = dot(OA,Normal);
            于是可以寫出如下公式。
            float3 EyeR = Eye - Pos;  float3 reflectVec = 2*dot(EyeR,Normal)*Normal - EyeR;

            當然,你也可以使用高級語言中的reflect函數來求反射
            在HLSL中。
            ret reflect(i, n)

            v = i - 2 * dot(i, n) * n

            上面的公式中。i為入射方向,v為反射方向,n為法線。
            由于EyeR 為觀察方向的反方向,即入射方向的反方向
            所以 reflectVec = reflect(-EyeR,Normal)即可求得。

            最后將reflectVec轉換到觀察空間,然后對CUBE紋理進行采樣即可。

            下面是HLSL中我使用的代碼。該代碼在D3D SDK的HDRCubeMap.fx中可見。

            //VS
            float4x4 matView;
            float4x4 matProjection;
            struct VS_INPUT 
            {
               float4 Position : POSITION0;
               float2 Texcoord : TEXCOORD0;
               float3 Normal :NORMAL;
            }
            ;

            struct VS_OUTPUT 
            {
               float4 Position : POSITION0;
               float3 Texcoord : TEXCOORD0;
            }
            ;

            VS_OUTPUT vs_main( VS_INPUT Input )
            {
               VS_OUTPUT Output;
               Output.Position 
            = mul(Input.Position,matView);
               
               float3 vN 
            = mul(Input.Normal,matView);
               float3 vEyeR 
            = -normalize(Output.Position);
              
               Output.Texcoord 
            = 2 * dot( vEyeR, vN ) * vN - vEyeR;
               
               Output.Position 
            = mul(Output.Position,matProjection);
               
            return( Output );
            }


            //PS
            samplerCUBE baseMap;

            struct PS_INPUT 
            {
               float3 Texcoord : TEXCOORD0;
               
            }
            ;

            float4 ps_main( PS_INPUT Input ) : COLOR0
            {
               
            return texCUBE( baseMap, Input.Texcoord );
               
            }


            在此對float3 vEyeR = -normalize(Output.Position);作一下解釋。
            我們上面講到的 EyeR的計算為Eye- Pos。 但是,由于N和Pos已轉入攝相機空間。則此時的Eye為(0,0,0)。 并且,不一定要單位化vEyeR
            所以上面的解法可以讓你不用再傳入觀察點。
            最后,我們來圍觀一下效果。




            我是在RenderMonkey中測試的SHADER,所以,上面貼出來的,即為原碼。
            下面是用到的cubemap圖的樣子


            OK,謝謝欣賞,歡迎交流
            GMAIL :BoYueGame

            posted on 2011-01-07 13:32 麒麟子 閱讀(4145) 評論(2)  編輯 收藏 引用 所屬分類: GPU and Graphic

            評論

            # re: CubeMap視線反射方向計算詳解[未登錄] 2011-01-07 19:08 孔雀

            哥們的博客寫得很專業

            內容、格式 兩個都好。

            膜拜一個  回復  更多評論   

            # re: CubeMap視線反射方向計算詳解 2011-01-08 00:50 Rambler

            @孔雀
            3Q  回復  更多評論   

            无码精品久久久天天影视| 精品熟女少妇av免费久久| 亚洲国产精品无码久久SM | 久久久久av无码免费网| 国产三级久久久精品麻豆三级| 亚洲国产成人久久综合区| 久久久91精品国产一区二区三区| 中文精品久久久久人妻不卡| 亚洲国产成人乱码精品女人久久久不卡 | 亚洲中文字幕无码久久2020| 热久久国产欧美一区二区精品| 国产国产成人精品久久| 久久99精品久久只有精品| 精品国产乱码久久久久软件| 久久99精品久久久大学生| 97精品国产97久久久久久免费| 久久青青草视频| 久久久噜噜噜久久中文字幕色伊伊| 久久久久免费视频| 亚洲精品WWW久久久久久| 久久久久人妻一区精品| 色综合久久天天综线观看| 亚洲一级Av无码毛片久久精品| 久久精品中文无码资源站| 久久丫精品国产亚洲av不卡| 久久精品国产99久久久| 一级做a爱片久久毛片| 久久久久久无码国产精品中文字幕| 久久久久亚洲爆乳少妇无| 国产色综合久久无码有码| 99久久人妻无码精品系列蜜桃| 99久久精品国产一区二区| 伊人久久成人成综合网222| 亚洲狠狠婷婷综合久久蜜芽 | 无码久久精品国产亚洲Av影片| 久久精品亚洲一区二区三区浴池| 久久本道伊人久久| 狠狠久久综合伊人不卡| 久久久久久曰本AV免费免费| 天天爽天天爽天天片a久久网| 精品久久久无码中文字幕|