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

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

            統(tǒng)計

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

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

            Decals Using Projective Texture Mapping

            講投影紋理的好文章網(wǎng)上是很多的,在此給大家一個參考鏈接,我就不再呈述了?!〈宋恼碌拿枋龊芤锥?。

            投影紋理映射(Projective Texture Mapping)

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

             

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

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

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

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

             

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

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

            image

            image

            image

             

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

             

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

            第一種。

            1、正常渲染模型。

            無它!

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

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

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

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

             

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

             

            第二種。

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

             

            本文演示的是第一種情況,因為它更貼近于實際應(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傳遞一個空間位置。

             

             

            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);//將世界坐標變換到紋理投影空間坐標并規(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所做的工作就是將世界坐標轉(zhuǎn)換到投影空間,再轉(zhuǎn)換為紋理坐標。

            需要說明一點的是,為了測試方便,我僅假設(shè)此時攝相機觀察和投影方向為-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)

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

            紋理會左右延伸。

             

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

             

            結(jié)尾:

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

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

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

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

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

            五、本文靈感來源于此貼: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

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

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

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

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

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

            亚洲日韩中文无码久久| 国产A三级久久精品| 色综合色天天久久婷婷基地 | 亚洲国产精品热久久| 狠狠精品久久久无码中文字幕 | 国产国产成人久久精品| 综合久久精品色| 久久精品国产69国产精品亚洲| 少妇久久久久久被弄到高潮| 久久综合香蕉国产蜜臀AV| 精品欧美一区二区三区久久久| 久久精品国产亚洲av麻豆图片| 一本大道久久a久久精品综合| 久久久久国产精品人妻| 国产精品久久久久久久午夜片| 亚洲狠狠婷婷综合久久久久| 久久亚洲视频| 国产精品VIDEOSSEX久久发布| 97精品伊人久久大香线蕉app| 亚洲一级Av无码毛片久久精品| 中文字幕一区二区三区久久网站| 一本一道久久综合狠狠老| 久久只有这精品99| 日韩欧美亚洲综合久久影院Ds | 亚洲精品高清久久| 国内精品久久久久久99| 婷婷综合久久中文字幕蜜桃三电影| 日本加勒比久久精品| 久久久久这里只有精品 | 国产精品久久久久久久久鸭| 久久精品国产亚洲AV高清热| 久久久久久精品免费免费自慰| 亚洲精品高清一二区久久| 久久久久亚洲AV综合波多野结衣| 久久精品中文字幕有码| 日本欧美国产精品第一页久久| 久久久这里有精品中文字幕| 欧美日韩精品久久免费| 精品无码久久久久久午夜| 国产一级做a爰片久久毛片| 老司机国内精品久久久久|