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

            3d Game Walkman

            3d圖形渲染,網絡引擎 — tonykee's Blog
            隨筆 - 45, 文章 - 0, 評論 - 309, 引用 - 0
            數據加載中……

            能穿透alphatest紋理的shadowmap

            這幾天加入了shadowmap影子,著實費了點腦子看起來很簡單的,可這東西牽扯到很多東西,場景要成像的對象都要統一納入深度圖里面渲染一遍,加了很多渲染方面的組織代碼,靜態模型,骨骼模型,等等,都要影子,渲染的方法還略有區別,真是很繁瑣,眼看就要成功了,可煩心事又來了,燈光沒辦法穿透alpha紋理,那些樹葉都是一大片一大片的,根本不透光,場景中為了節約三角形,要做alphatest的紋理比比皆是,如果光線穿不透alpha紋理,那可太糟糕了,在gameres上問了一把,clayman和六水兩位大俠給了我不小的幫助,主要的思路是深度圖是需要做alphatest的,這樣才能被穿透,直接用R32F我試過了,alphatest根本無效,也不知道是不是顯卡太差了,看了一篇文章,
            GPU GEM1
            http://http.developer.nvidia.com/GPUGems/gpugems_ch12.html
            有提到這個算法,可以把R32F轉換為A8R8G8B8即可節約內存又可以提高兼容性,很多顯卡還不支持R32F呢,
            這就涉及到一個壓縮和解壓的算法,那篇NV的文章說的太抽象,很不具體,試了很久也不成功。
            網上找了一個晚上加一上午的時間,終于找到了答案
            http://www.gamedev.net/community/forums/topic.asp?topic_id=442138

            這個主題就是討論這個算法的。

            其中:
            float4 pack(float fDist)
            {
                const float4 bitSh = float4(   256*256*256, 256*256,   256,         1);
             const float4 bitMsk = float4(   0,      1.0/256.0,    1.0/256.0,    1.0/256.0);

             float4 comp;
             comp = fDist * bitSh;
             comp = frac(comp);
             comp -= comp.xxyz * bitMsk;
              //我這里稍微該了改,把最后低的精度移到了末尾
             return float4(comp.y, comp.z, comp.w, comp.x);
            }


            float unpack(sampler ShadowMapS, float2 texcood)
            {
              float4 vec = tex2D(ShadowMapS, texcood);
              //我這里稍微該了改,把最后一個精度移到了末尾

              const float4 bitShifts = float4(1.0/(256.0*256.0), 1.0/256.0, 1, 1.0/(256.0*256.0*256.0));
              //return vec.x*1.0/(256.0*256.0*256.0) + vec.y* 1.0/(256.0*256.0) + vec.z*1.0/256.0 + vec.w;
              return dot(vec.xyzw , bitShifts);
            }

            //以下是shadowmap的拍攝過程

            void BuildShadowMapVS(float3 posL : POSITION0,
                                  float3 normalL : NORMAL0,
                                  float2 tex0    : TEXCOORD0,
                                  out float4 posH : POSITION0,
                                  out float2 depth : TEXCOORD0,
                                  out float2 tex1 : TEXCOORD1
                                  )
            {
             // Render from light's perspective.
             posH = mul(float4(posL, 1.0f), gLightWVP); 
             // Propagate z- and w-coordinates.
             depth = posH.zw;
             tex1 = tex0;
            }

             

            float4 BuildShadowMapPS(float2 depth : TEXCOORD0, float2 tex1 : TEXCOORD1) : COLOR
            {
             // Each pixel in the shadow map stores the pixel depth from the
             // light source in normalized device coordinates.

             float a = tex2D(TexS, tex1).a;
             float f = clamp(depth.x / depth.y , 0, 1);
                
                 float4 val=pack(f);
                 if(a < 0.5)
                 val.a = 0.0f;
                  else
                 val.a = 1.0f;
                 return val;
            }

            就是關鍵的float與A8R8G8B8之間的壓縮和解壓的算法,其中
             comp -= comp.xxyz * bitMsk;很難理解,但仔細想一想你就能想明白其中的道理
            這個是可以轉換了,但里面還有更為關鍵的東西,還要把A8的alpha信息加進去,不然還是不能做影子的alpha測試,根據六水兄的提議,我也忽略了256*256*256末尾的精度,加入了成像紋理的alpha信息,這樣最終實現了光線對alpha紋理的穿透,還真是不容易,發圖出來鑒賞一下這兩天的成果:

            posted on 2008-05-27 15:57 李侃 閱讀(3079) 評論(8)  編輯 收藏 引用 所屬分類: 前臺客戶端

            評論

            # re: 能穿透alphatest紋理的shadowmap  回復  更多評論   

            高,實在是高!!

            請問你學3d多久了
            2008-05-27 16:05 | xiao7cn

            # re: 能穿透alphatest紋理的shadowmap  回復  更多評論   

            原來gameres上的問題是你問的啊。
            2008-05-27 16:13 | 空明流轉

            # re: 能穿透alphatest紋理的shadowmap  回復  更多評論   

            時間不算長,沒記錯的話,應該是22個月吧
            2008-05-27 16:17 | 李侃

            # re: 能穿透alphatest紋理的shadowmap  回復  更多評論   

            渲染方面學的不好,見笑了。
            2008-05-27 16:20 | 李侃

            # re: 能穿透alphatest紋理的shadowmap  回復  更多評論   

            才知道你的昵稱就是tonykee。
            2008-05-27 17:50 | 空明流轉

            # re: 能穿透alphatest紋理的shadowmap  回復  更多評論   

            厲害是個牛人
            2008-05-28 16:06 | 盛大推廣員

            # re: 能穿透alphatest紋理的shadowmap  回復  更多評論   

            在PS里用紋理的Alpha來clip就可以了,連Alpha通道都不用占用。
            2008-12-16 21:36 | 藍色比特

            # re: 能穿透alphatest紋理的shadowmap  回復  更多評論   

            弱弱問下
            這樣應該是spot light吧,如果是平行光怎么辦...
            2009-02-05 21:02 | dongch007
            亚洲精品国产字幕久久不卡| 99久久精品国产一区二区| 中文字幕久久精品| 久久久久久久精品成人热色戒| 少妇人妻88久久中文字幕| 久久久久综合网久久| 开心久久婷婷综合中文字幕| 青青草原综合久久大伊人| 国内精品人妻无码久久久影院| 2021国产成人精品久久| 亚洲国产成人乱码精品女人久久久不卡 | 久久久久亚洲AV成人网| 伊人久久大香线蕉综合影院首页| 99热精品久久只有精品| 男女久久久国产一区二区三区| 久久精品亚洲福利| 四虎国产精品免费久久久| 久久综合噜噜激激的五月天| 久久成人精品| 久久久精品久久久久久| 97精品伊人久久大香线蕉app| 久久无码专区国产精品发布| 久久99亚洲综合精品首页| 久久国产免费观看精品3| 亚洲女久久久噜噜噜熟女| 性欧美大战久久久久久久| 久久精品成人欧美大片| 久久精品国产只有精品2020| 久久精品国产亚洲AV无码偷窥| 18禁黄久久久AAA片| 香蕉久久夜色精品国产2020| 久久久久99精品成人片三人毛片| 9999国产精品欧美久久久久久| 免费国产99久久久香蕉| 99久久精品免费看国产免费| 国产精品福利一区二区久久| 久久99国产精品久久| 国产精品久久网| 国产精品欧美亚洲韩国日本久久 | 久久99国产综合精品| 精品久久久久中文字幕日本 |