• <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圖形渲染,網(wǎng)絡(luò)引擎 — tonykee's Blog
            隨筆 - 45, 文章 - 0, 評(píng)論 - 309, 引用 - 0
            數(shù)據(jù)加載中……

            Early ZBuffer [轉(zhuǎn)]

            看到這篇文章寫(xiě)的還不錯(cuò),順手轉(zhuǎn)過(guò)來(lái)了^_^
              
               一、最近在優(yōu)化客戶端性能的時(shí)候,看到了Early ZBuffer。在VSPS中間GPU會(huì)對(duì)進(jìn)行Z-buffer預(yù)判機(jī)制,對(duì)無(wú)效像素進(jìn)行剔除,ATI、NVIDIA都有自己的Z-buffer預(yù)判機(jī)制。其實(shí)Doom3的時(shí)候已經(jīng)開(kāi)始使用預(yù)填充ZBuffer了,因?yàn)镈oom3的PS需要處理陰影、NormalMap、LightMap及其他貼圖處理,PS指令非常多,所以無(wú)效像素的剔除對(duì)性能影響是很大的,越早將無(wú)效像素剔除,顯卡便能獲得更多的時(shí)間對(duì)有效像素進(jìn)行渲染。

             

                二、Early-Z技術(shù)介紹(這段摘自http://tech.sina.com.cn/h/2008-06-17/09302262913.shtml

              當(dāng)代的GPU都會(huì)采用Z-buffer去記錄哪些像素是可見(jiàn),而哪些像素是被遮擋而不可見(jiàn)。一個(gè)3D Frame最終要轉(zhuǎn)換成為2D圖像才能表示在屏幕上面,來(lái)自GPU連續(xù)的頂點(diǎn)流(vertices)會(huì)構(gòu)建這個(gè)frame,從這個(gè)頂點(diǎn)流獲取相應(yīng)的2D坐 標(biāo)去生成多邊形。多邊形的連續(xù)產(chǎn)生會(huì)覆蓋原來(lái)的區(qū)域,因而Z-buffer的信息就是告訴ROP,哪些像素是可見(jiàn)哪些是不可見(jiàn)的。提前進(jìn)行的Early- Z對(duì)比可以節(jié)省大量資源,因?yàn)橥粋€(gè)區(qū)域被多個(gè)多邊形覆蓋的次數(shù)輕而易舉地達(dá)到原來(lái)的四倍甚至更高





            目前甚少方法可以利用Z-buffer信息去挑選或者排出被遮擋像素的渲染,Z-Cull就是這樣的一個(gè)方法。Z-comparision通常 會(huì)發(fā)生在ROP的后期。問(wèn)題就產(chǎn)生,意味著pixel要通過(guò)完整的ROP管線才能被發(fā)現(xiàn)是否可見(jiàn)。一些復(fù)雜的包含數(shù)千步驟的shader程序,即使是被遮 擋的pixel也全部通過(guò)流水線,這顯然浪費(fèi)了GPU的性能。Early-Z移去不可見(jiàn)像素在它們進(jìn)入流水線之前,這樣顯然會(huì)提高性能,NVIDIA認(rèn)為 這個(gè)操作提升22%附近的性能。

             

                三、具體實(shí)現(xiàn):場(chǎng)景渲染兩遍:
                void Render()
                {
                    DrawZPass();    
                    DrawColorPass();    
                }
                
                // 關(guān)閉ColorBuffer寫(xiě)入,以最簡(jiǎn)單的渲染狀態(tài)繪制場(chǎng)景
                void DrawZPass()
                {
                    // Disable color writes
                    pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0x00000000);

                    // Ensure alpha off
                    pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, false );
                    pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, false );

                    // Ensure z-enabled
                    pD3DDevice->SetRenderState( D3DRS_ZENABLE, true );
                    pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, true );

                    DrawScene();

                    pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0x0000000F );
                }

                // 正常渲染
                void DrawColorPass()
                {
                    pD3DDevice->SetRenderState( D3DRS_DEPTHBIAS, F2DW(-0.001f) );    
                    DrawScene()
                }

                1.DrawZPass:應(yīng)該跳過(guò)AlphaBlend、AlphaTest的實(shí)體。
                2.DrawColorPass:對(duì)于那些預(yù)寫(xiě)入ZBuffer的實(shí)體,在這個(gè)Pass中只需開(kāi)啟ZBufferTest、并且可以關(guān)閉ZBufferWrite。
                3.使用了EarlyZBuffer,就不用再排序了。

                4.在第二遍渲染的時(shí)候,因?yàn)楦↑c(diǎn)的誤差,會(huì)有ZFighting現(xiàn)象,所以應(yīng)允許一定的誤差。

                5.Early ZBuffer不一定適用所有場(chǎng)景,比如有大量實(shí)體的室外場(chǎng)景,因?yàn)镈rawZPass畢竟也要繪制所有的實(shí)體,如果調(diào)用太多DP,性能反而會(huì)有所下降。


                 四、另外一個(gè)性能優(yōu)化提示:先畫(huà)UI;最后繪制天空盒。這也于ZBuffer有關(guān),因?yàn)樘炜蘸锌偸秋@示在最后,而天空盒總是被前面的實(shí)體遮擋了大部分區(qū)域。

            不過(guò)最后繪制天空盒時(shí)候,大家會(huì)問(wèn)如何避免被FarPlane裁剪,有一個(gè)技巧可以解決,在SkyShader的VS輸出投影后的位置時(shí),這樣設(shè)置:

                 Out.position = mul(mvp, vertex).xyww。// 不是Out.position = mul(mvp, vertex);

                這樣天空盒投影后的總是映射到FarPlane,這樣就完美了,哈哈。這個(gè)方法時(shí)我在ATI的《Depth In Depth》文檔中看到的。UI也是,游戲里的UI區(qū)域如果預(yù)先寫(xiě)入ZBuffer,也可以避免大量的無(wú)效PS處理。


                 五、最后希望大家可以仔細(xì)看看《Depth In Depth》,里邊有很多優(yōu)化提示。

            posted on 2009-12-01 14:20 李侃 閱讀(2551) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 前臺(tái)客戶端

            欧美熟妇另类久久久久久不卡| 久久精品www人人爽人人| 久久精品黄AA片一区二区三区| 亚洲v国产v天堂a无码久久| 久久久久国产一级毛片高清版| 久久av无码专区亚洲av桃花岛| 久久狠狠爱亚洲综合影院| 中文字幕精品无码久久久久久3D日动漫 | 久久青青草原精品国产| 久久精品综合网| 久久天天婷婷五月俺也去| 久久亚洲天堂| 亚洲精品国精品久久99热| 亚洲精品tv久久久久久久久久| 久久久久免费视频| 亚洲精品成人久久久| 久久久精品久久久久特色影视| 国产伊人久久| 亚洲国产香蕉人人爽成AV片久久| 日日狠狠久久偷偷色综合96蜜桃| 欧美国产成人久久精品| 亚洲精品无码久久久久久| 99久久99这里只有免费费精品 | 综合人妻久久一区二区精品| 久久亚洲精品无码aⅴ大香| 久久精品久久久久观看99水蜜桃| 国产毛片久久久久久国产毛片 | 日本精品久久久久久久久免费| 夜夜亚洲天天久久| 国产成人久久久精品二区三区 | 97久久精品午夜一区二区| 久久人人爽人人爽人人片av麻烦| 久久久久久免费视频| 精品久久久久成人码免费动漫 | 久久天天婷婷五月俺也去 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久嫩草影院免费看夜色| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 亚洲综合伊人久久综合| 亚洲愉拍99热成人精品热久久| 亚洲色大成网站www久久九|