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

            麒麟子

            ~~

            導(dǎo)航

            <2011年1月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統(tǒng)計(jì)

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            CubeMap視線反射方向計(jì)算詳解

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

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


            值得說明的一點(diǎn)是。在進(jìn)行計(jì)算時(shí),入射方向和反射方向以及法線方向并未要求一定要單位化。
            二、用這個(gè)反射方向在PS中對(duì)CUBE紋理進(jìn)行采樣。

            下面是一個(gè)對(duì)反射向量計(jì)算的通用求解過程。

            我們假設(shè)頂點(diǎn)位置為Pos 即點(diǎn)O,視點(diǎn)為Eye 即點(diǎn)A (均為同一坐標(biāo)系空間)
            那么,我們的觀察方向便是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;

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

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

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

            最后將reflectVec轉(zhuǎn)換到觀察空間,然后對(duì)CUBE紋理進(jìn)行采樣即可。

            下面是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 );
               
            }


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




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


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

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

            評(píng)論

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

            哥們的博客寫得很專業(yè)

            內(nèi)容、格式 兩個(gè)都好。

            膜拜一個(gè)  回復(fù)  更多評(píng)論   

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

            @孔雀
            3Q  回復(fù)  更多評(píng)論   

            久久久久久伊人高潮影院| 久久精品亚洲精品国产色婷| 热99re久久国超精品首页| 国产精品成人久久久久三级午夜电影| 无码人妻精品一区二区三区久久久| 综合人妻久久一区二区精品| 99久久精品九九亚洲精品| 漂亮人妻被中出中文字幕久久| 精品久久久无码人妻中文字幕豆芽| 久久久久亚洲AV成人网| 国内精品久久久久久久影视麻豆| 婷婷伊人久久大香线蕉AV| 手机看片久久高清国产日韩| 国产成人精品综合久久久| 97久久久精品综合88久久| 国产亚洲精品久久久久秋霞| 99久久免费国产精品特黄| 2021国内久久精品| 日韩精品久久久久久免费| 蜜臀久久99精品久久久久久小说| 久久这里只有精品18| 久久人爽人人爽人人片AV | 久久久久久综合一区中文字幕| 狠狠色婷婷久久一区二区三区| 99久久免费国产精精品| 一本大道久久a久久精品综合| 久久国产精品免费| 国产高潮国产高潮久久久| 国产99久久久久久免费看| 国产成人精品三上悠亚久久| 国内精品久久久久影院一蜜桃 | 久久久免费观成人影院| 亚洲中文精品久久久久久不卡| 欧美噜噜久久久XXX| 久久国产精品一区| 亚洲一本综合久久| 伊人色综合久久| 国产精品无码久久综合网| AV狠狠色丁香婷婷综合久久| 伊人色综合久久天天网| 亚洲七七久久精品中文国产|