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

            麒麟子

            ~~

            導航

            <2023年2月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627281234
            567891011

            統計

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

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

            Decals Using Projective Texture Mapping

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

            投影紋理映射(Projective Texture Mapping)

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

             

            上面的文章從原理上講述了投影紋理是什么,本文則利用投影紋理進行一個實際的應用。

            在游戲中貼花最常見的地方就是用鼠標選擇一個目標后,地上出現的一個圓圈,或者范圍魔法在施放時的提示區域。

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

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

             

            什么? 地上是一圈?是的,但是呢,我們的紋理是方的。 我們看到是圈,并不表示我們要把紋理貼到一個圈上。

            下面是我在RenderMonkey里測試的結果。

            image

            image

            image

             

            OK,圍觀完畢,下面簡單說一下如何實現。

             

            用投影紋理進行貼花有兩種做法。

            第一種。

            1、正常渲染模型。

            無它!

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

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

            3、將此三角形組進行渲染(相當于做為一個模型渲染),紋理映射時采用投影紋理。

            渲染時,要打開全局混合開關。

             

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

             

            第二種。

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

             

            本文演示的是第一種情況,因為它更貼近于實際應用。并且并未做三角面剔除,而是僅僅將模型渲染了兩次。

             

            下面是投影紋理的HLSL代碼,以及相關解釋。

             

            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傳遞一個空間位置。

             

             

            PS: 

            sampler2D baseMap;
            sampler2D Texture1; //貼這張紋理時,其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);//將世界坐標變換到紋理投影空間坐標并規范化到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所做的工作就是將世界坐標轉換到投影空間,再轉換為紋理坐標。

            需要說明一點的是,為了測試方便,我僅假設此時攝相機觀察和投影方向為-Y方向。所以

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

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

             

            另外,對于

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

            這句話,我寫在這里,是作為裁剪使用,若沒有這個. 就算你設置為了CLAMP,那么當你的紋理邊緣的ALPHA不為0時,你會看到

            紋理會左右延伸。

             

            而若你未選擇CLAMP尋址方式,那你的效果就百般神奇了。 也可以將上面屏蔽的代碼解開,用于裁剪。

             

            結尾:

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

            二、在貼花PASS中,需要將全局混合開啟,并設置相應的SRCBLEND(SRC_ALPHA)和DESTBLEND(DEST_ALPHA)值。括號內為我用的值。

            當然,如果你不想讓貼花與場景(模型)混合,則可以不開啟。 

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

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

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

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

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

            評論

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

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

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

            @Rambler
            已經加上了不好意思  回復  更多評論   

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

            @cr173
            OK!  回復  更多評論   

            7777久久久国产精品消防器材| 国产高清国内精品福利99久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 一级a性色生活片久久无少妇一级婬片免费放| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久福利青草精品资源站| 国产精品亚洲美女久久久| 亚洲精品tv久久久久| 久久国产精品成人影院| 久久亚洲国产精品成人AV秋霞| 国产精品久久久99| 亚洲AV成人无码久久精品老人| 一本久久a久久精品综合香蕉| av无码久久久久久不卡网站| 少妇熟女久久综合网色欲| 精品久久久久久中文字幕| 久久天天躁狠狠躁夜夜躁2014| 久久精品国产国产精品四凭| 国产精品欧美久久久天天影视| 亚洲级αV无码毛片久久精品| 国产精品嫩草影院久久| 久久精品国产亚洲精品2020 | 国产偷久久久精品专区| 久久涩综合| 亚洲国产精品无码久久九九| 麻豆精品久久久一区二区| 一级做a爱片久久毛片| 国産精品久久久久久久| 狠狠狠色丁香婷婷综合久久五月| 久久久久久久久66精品片| 亚洲精品乱码久久久久久蜜桃不卡 | 国产精品99久久精品| A狠狠久久蜜臀婷色中文网| 亚洲AV无码久久| 久久精品国产亚洲AV无码偷窥| 亚洲AV无一区二区三区久久| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 久久99国产精品尤物| AV无码久久久久不卡网站下载| 久久人人爽人人爽人人AV东京热| 久久这里只有精品18|