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

            <2008年12月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            統(tǒng)計(jì)

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            使用投影紋理進(jìn)行模型貼花(Mesh Decals)

            Decals Using Projective Texture Mapping

            講投影紋理的好文章網(wǎng)上是很多的,在此給大家一個(gè)參考鏈接,我就不再呈述了。 此文章的描述很易懂。

            投影紋理映射(Projective Texture Mapping)

            http://wwwnno00.irrlicht3d.cn:8011/redirect.php?tid=54109&goto=lastpost

             

            上面的文章從原理上講述了投影紋理是什么,本文則利用投影紋理進(jìn)行一個(gè)實(shí)際的應(yīng)用。

            在游戲中貼花最常見的地方就是用鼠標(biāo)選擇一個(gè)目標(biāo)后,地上出現(xiàn)的一個(gè)圓圈,或者范圍魔法在施放時(shí)的提示區(qū)域。

            這個(gè)紋理會(huì)隨著模型和地圖的表面進(jìn)地扭曲,而非一個(gè)平面,所以,我們不論怎么做,都會(huì)進(jìn)行一個(gè)“投影”的思想,才能讓貼上去

            的紋理在某一個(gè)方向上看的時(shí)候,是一個(gè)完整的畫面。(我們地上的圈,就是從上往下貼的,所以你從上往下看時(shí),會(huì)看到一個(gè)完整無扭曲的圖片)。

             

            什么? 地上是一圈?是的,但是呢,我們的紋理是方的?!∥覀兛吹绞侨Γ⒉槐硎疚覀円鸭y理貼到一個(gè)圈上。

            下面是我在RenderMonkey里測試的結(jié)果。

            image

            image

            image

             

            OK,圍觀完畢,下面簡單說一下如何實(shí)現(xiàn)。

             

            用投影紋理進(jìn)行貼花有兩種做法。

            第一種。

            1、正常渲染模型。

            無它!

            2、根據(jù)投影方向,投影半徑找到投影時(shí)需要渲染的三角形組。

            這種貼花的效率損耗就是花在這里了,所以三角形剔除算法要比較高效才行。

            3、將此三角形組進(jìn)行渲染(相當(dāng)于做為一個(gè)模型渲染),紋理映射時(shí)采用投影紋理。

            渲染時(shí),要打開全局混合開關(guān)。

             

            采用這一種渲染方式時(shí),不需要占用紋理通道,也就是可以在模型上貼無數(shù)個(gè)花。

             

            第二種。

            這是一種占用紋理通道的做法。就是只渲染一次,而在PS中,進(jìn)行紋理混合。

             

            本文演示的是第一種情況,因?yàn)樗N近于實(shí)際應(yīng)用。并且并未做三角面剔除,而是僅僅將模型渲染了兩次。

             

            下面是投影紋理的HLSL代碼,以及相關(guān)解釋。

             

            VS:

            struct VS_INPUT
            {
               float4 Position : POSITION0;
            };

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

            VS_OUTPUT vs_main( VS_INPUT Input )
            {
               VS_OUTPUT Output;

               Output.Position = mul( Input.Position, matViewProjection );
               Output.WorldPos = Input.Position;
               return( Output );
            }

            VS所做的工作并沒有什么特別的,僅是需要多向PS傳遞一個(gè)空間位置。

             

             

            PS: 

            sampler2D baseMap;
            sampler2D Texture1; //貼這張紋理時(shí),其UV尋址方式最好為CLAMP
            struct PS_INPUT
            {
               float3 WorldPos : TEXCOORD0;
            };

            float4 ps_main( PS_INPUT Input ) : COLOR0
            {
               float3 Center = float3(0, 0, 20);//投影中心,Y值被忽略。
               float Radius = 4;//投影范圍
               float3 UVector = float3(1, 0, 0)/(2 * Radius);//將世界坐標(biāo)變換到紋理投影空間坐標(biāo)并規(guī)范化到0-1之間(正投影)
               float3 VVector = float3(0, 0, 1)/(-2 * Radius);//同上
               float2 coord; 
               coord.x = dot(Input.WorldPos - Center, UVector) + 0.5;
               coord.y = dot(Input.WorldPos - Center, VVector) + 0.5;
              // if(coord.x < 1 && coord.y < 1 && coord.x>0 && coord.y>0)
               return tex2D( Texture1, coord);
               //else
               //return 0;
            }

             

             

             

            PS所做的工作就是將世界坐標(biāo)轉(zhuǎn)換到投影空間,再轉(zhuǎn)換為紋理坐標(biāo)。

            需要說明一點(diǎn)的是,為了測試方便,我僅假設(shè)此時(shí)攝相機(jī)觀察和投影方向?yàn)?Y方向。所以

            dot(Input.WorldPos - Center, UVector)+0.5

            上面這句話其實(shí)相當(dāng)于是mul(Input.WorldPos,matProjTexture)/2.0+0.5;

             

            另外,對于

              // if(coord.x < 1 && coord.y < 1 && coord.x>0 && coord.y>0)

            這句話,我寫在這里,是作為裁剪使用,若沒有這個(gè). 就算你設(shè)置為了CLAMP,那么當(dāng)你的紋理邊緣的ALPHA不為0時(shí),你會(huì)看到

            紋理會(huì)左右延伸。

             

            而若你未選擇CLAMP尋址方式,那你的效果就百般神奇了?!∫部梢詫⑸厦嫫帘蔚拇a解開,用于裁剪。

             

            結(jié)尾:

            一、投影紋理進(jìn)行模型貼花時(shí),主要是進(jìn)行三角面剔除,使在渲染貼花時(shí),提交最少的三角面。

            二、在貼花PASS中,需要將全局混合開啟,并設(shè)置相應(yīng)的SRCBLEND(SRC_ALPHA)和DESTBLEND(DEST_ALPHA)值。括號(hào)內(nèi)為我用的值。

            當(dāng)然,如果你不想讓貼花與場景(模型)混合,則可以不開啟?!?/p>

            三、請注意紋理的尋址方式以及紋理邊緣的ALPHA情況。 若紋理邊緣ALPHA不為0,則可以手工進(jìn)行裁剪。

            四、本文僅是采用了固定的投影方向和SHADER內(nèi)部定義變量的方式來進(jìn)行貼花渲染?!〔⑶?,并未進(jìn)行模型三角面剔除。所以若要使用,則需要注意第一個(gè)問題。

            五、本文靈感來源于此貼:http://forums.create.msdn.com/forums/p/34339/198791.aspx

            六、支持郵件交流:BoYueGame#Gmail#com

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

            評(píng)論

            # re: 使用投影紋理進(jìn)行模型貼花(Mesh Decals) 2011-01-07 09:57 Rambler

            老子很怒了。
            下面這網(wǎng)站轉(zhuǎn)我貼就算了,還刪減貼子內(nèi)容!隱藏出處和文中引用的鏈接。
            大家要注意了!雖然東西不值錢,但也不能這樣被嫖竊
            http://www.cr173.com/html/10331_1.html  回復(fù)  更多評(píng)論   

            # re: 使用投影紋理進(jìn)行模型貼花(Mesh Decals) 2011-01-07 11:53 cr173

            @Rambler
            已經(jīng)加上了不好意思  回復(fù)  更多評(píng)論   

            # re: 使用投影紋理進(jìn)行模型貼花(Mesh Decals) 2011-01-07 12:20 Rambler

            @cr173
            OK!  回復(fù)  更多評(píng)論   

            久久久久婷婷| 国产精品久久久久久五月尺| 久久国产免费观看精品3| 精品久久8x国产免费观看| 国产成人久久777777| 久久成人小视频| 亚洲欧美精品伊人久久| 久久久久国产精品人妻| 久久精品国产99国产精品澳门 | 久久伊人精品青青草原日本| 亚洲精品乱码久久久久久自慰| 久久综合九色综合精品| 久久精品国产亚洲av麻豆图片| AA级片免费看视频久久| 浪潮AV色综合久久天堂| 色偷偷91久久综合噜噜噜噜| 久久久久久毛片免费播放| 99久久做夜夜爱天天做精品| 久久99毛片免费观看不卡| 欧洲人妻丰满av无码久久不卡| 久久久久国产亚洲AV麻豆| 日本免费一区二区久久人人澡 | 久久99精品久久久久子伦| 亚洲а∨天堂久久精品9966| 国产亚洲美女精品久久久| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲精品第一综合99久久| 久久久不卡国产精品一区二区| 狠狠狠色丁香婷婷综合久久俺| 久久亚洲精品无码AV红樱桃| 久久偷看各类wc女厕嘘嘘| 一本色道久久88精品综合 | 久久国产精品99国产精| 国产精品青草久久久久婷婷| 精品久久久久久国产| 久久精品国产亚洲精品| 久久久精品一区二区三区| 亚洲精品乱码久久久久久按摩| 久久综合色之久久综合| 久久成人国产精品| 色婷婷综合久久久久中文|