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

            李錦俊(mybios)的blog

            游戲開發(fā) C++ Cocos2d-x OpenGL DirectX 數(shù)學(xué) 計(jì)算機(jī)圖形學(xué) SQL Server

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

            公告

            QQ:30743734
            EMain:mybios@qq.com

            常用鏈接

            留言簿(16)

            我參與的團(tuán)隊(duì)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 370257
            • 排名 - 67

            最新評論

            閱讀排行榜

            評論排行榜

            Shader Model 3 Using Vertex Texture

            頂點(diǎn)紋理白皮書中文版

            ?

            ?

            翻譯者 周波 zhoubo22@hotmail.com

            版權(quán)所有 ? Philipp Gerasimov

            ????????????????? Randima (Randy) Fernando

            ???? Simon Green

            ?????????? NVIDIA Corporation

            ?

            僅以此文贈(zèng)與 Rita 19 歲生日快樂

            ?

            ?

            ?

            Shader Model 3.0:Using Vertex Textures? SM3: 使用頂點(diǎn)紋理

            ?

            ????? 隨著 GPU 可編程特性的發(fā)展, Vertex Shader Pixel Shader 的差別越來越大。現(xiàn)在, Geforce6 系列 gpu Vertex Shader Pixel Shader 之間的通用性特征向前發(fā)展了一大步。這篇文章特別介紹了 Shader Model3 的一項(xiàng)技術(shù), Vertex Shader Fetch 。它允許 Vertex Shader Pixel Shader 一樣從紋理中讀取數(shù)據(jù)。

            ????? 在現(xiàn)代圖形處理中,頂點(diǎn)處理的性能表現(xiàn)不是受制于內(nèi)存帶寬、 cpu 速度,就是受制于 Pixel Shader 的處理能力。但這也意味著你可以實(shí)現(xiàn)一個(gè)復(fù)雜的 Vertex Shader ,提高畫質(zhì),而且不會(huì)有多大損失。 Vertex Shader 的制作成本比 Pixel Shader 高,所以在最新的 6800 芯片里, Vertex Shader 的數(shù)目要少于 Pixel Shader 。這樣,我們就可以安心地實(shí)現(xiàn)一打漂亮的效果,比如流體的模擬等等。

            ????? 這篇白皮書將同時(shí)向您展示如何在 OPENGL 以及 DIRECTX 中實(shí)現(xiàn) Vertex Texture 。最后,我們將用一個(gè)游戲的范例向您演示使用 Vertex Texture 的情況

            ?????

            Specification 詳解

            ?

            ????? DIRECTX OPENGL 中都可以使用 Vertex Texture

            ?

            ?????? DIRECTX9

            ?

            ????? MS DX9SDK 的開發(fā)文檔中已經(jīng)包括了 VERTEX TEXTURE 的詳細(xì)說明。

            ????? Vertex Shader3( 即使用Vertex Shader3編譯器生成的Shader)支持 vertex_fetch 4 種紋理樣本。 Vertex Texture ,單從名稱上看就同傳統(tǒng)的 PIXEL TEXTURE 類似,但是同 PIXEL TEXTURE 比起來有一些差別,

            ?

            ????? 硬件無法直接支持 Bilinear Trilinear 過濾,但是您可以手動(dòng)在 Vertex Shader 中實(shí)現(xiàn)

            ????? 反鋸齒,內(nèi)容同上。

            ????? 自動(dòng) Mipmap LOD 無效

            ?

            ????? D3DCAPS 成員 MaxVertexShader30InstructionSlots 標(biāo)識(shí) Vertex Shader3 中代碼的上限行數(shù)。 MaxVShaderInstructionsExecuted 標(biāo)識(shí)了 Vertex Shader 的上限代碼行數(shù),包括 Texture Fetch 的數(shù)目。

            ????? DIRECTX9 支持軟件 Vertex Processing 模式下使用 Vertex Texture ,這樣甚至當(dāng)硬件不支持 Vertex Texture 時(shí)也可以運(yùn)行。

            ????? 6800 支持使用 D3DFMT_R32F and D3DFMT_A32B32G32R32F 的紋理格式實(shí)現(xiàn) Vertex Texture

            ?

            OPENGL

            ?

            ????? 頂點(diǎn)紋理查找通過 NV_V_PROGRAM3 擴(kuò)展實(shí)現(xiàn)。詳情請參閱 http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_vertex_program3.txt

            這是標(biāo)準(zhǔn) ARB vertex program language 的一項(xiàng) Option 操作)。這就意味著你可以調(diào)用現(xiàn)有的ARB API ,載入程序,設(shè)置參數(shù)。在程序開頭加入以下代碼就可以了:

            ????? OPTION NV_VERTEX_PROGRAM3

            ?

            在程序里加入 Vertex Texture

            ?

            ????? 使用 Vertex Texture 的步驟如下:

            ?????????? 檢查硬件的 Vertex Texture 支持情況

            ?????????? 創(chuàng)建 Vertex Texture 資源

            ?????????? Vertex Shader 中加入需要的代碼

            ????? 下面具體來看看怎樣在 DIRECTX 以及 OPENGL 中實(shí)現(xiàn)。

            ?????

            DIRECTX

            ?

            第一,檢查硬件是否支持,否則將不得不用軟件方式實(shí)現(xiàn)。調(diào)用 IDirect3D9::CheckDeviceFormat 里的 D3DUSAGE_QUERY_VERTEXTEXTURE 旗標(biāo)查詢 硬件支持的 Vertex Texture 格式。 Software Vertex Texture 支持所有 Vertex Texture 格式。

            ?

            OPENGL

            ?

            ????? OPENGL 里只需要檢查硬件是否支持 NV_VERTEX_PROGRAM3 擴(kuò)展。 GLUT 庫的 glutExtensionSupported 函數(shù)可以完成這項(xiàng)任務(wù)。 Vertex Texture 數(shù)目的上限用下列代碼獲得

            ????? glGetIntegerv( MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &vtex_units)

            ?? 6 系列 GPU 最大支持 4 個(gè)活動(dòng)紋理( Active Texture )。你可以盡情的在 Vertex Shader 中調(diào)用它們,不過要注意Vertex Shader的代碼行數(shù)。

            ??

            創(chuàng)建 Vertex Texture 資源

            ?

            ?????? DIRECTX9

            ?

            ????? 庫中的任何紋理創(chuàng)建函數(shù)都可以創(chuàng)建頂點(diǎn)紋理, IDirect3D9::CreateTexture,

            IDirect3D9::CreateCubeTexture, IDirect3D9::CreateVolumeTexture 等等。

            ????? 當(dāng)使用 SVP 時(shí),頂點(diǎn)紋理必須創(chuàng)建在 D3DPOOL_SCRATCH 池中。

            ?

            ?????? OPENGL

            ????? 基本紋理調(diào)用操作已經(jīng)包括了 Vertex Texture 的綁定,使用 GL_TEXTURE_2D 。目前只有 GL_LUMINANCE_FLOAT32_ATI GL_RGBA_FLOAT32_ATI 2 種格式支持 Vertex Texture 。這些格式都包含了 1 個(gè)或 4 個(gè) 32bit 浮點(diǎn)數(shù)據(jù)通道。注意,使用其他的紋理格式,或者使用不支持的過濾方式都可以導(dǎo)致驅(qū)動(dòng)調(diào)用 Software Vertex Processing 處理,導(dǎo)致性能下降。

            ????? 示例代碼如下:

            ????? GLuint vertex_texture;

            glGenTextures( 1, &vertex_texture);

            glBindTexture( GL_TEXTURE_2D, vertex_texture);

            glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

            glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);

            glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE_FLOAT32_ATI, width, height, 0,GL_LUMINANCE, GL_FLOAT, data);

            ?????

            Vertex Shader 里訪問 Vertex Texture

            ?

            ?????? DIRECTX9

            ?

            程序調(diào)用 IDirect3DDevice9::SetTexture 設(shè)置 Vertex Texture ,樣本索引為 D3DVERTEXTEXTURESAMPLER1 D3DVERTEXTEXTURESAMPLER3 。在 D3DPOOL_DEFAULT 里創(chuàng)建的 Vertex Texture 同時(shí)也可以設(shè)置成 PIXEL TEXTURE

            ????? Vertex Shader 里的紋理樣本必須使用 DEL_SAMPLEType 標(biāo)識(shí)。

            // 匯編代碼

            dcl_texcoord0 v0

            dcl_2D s0

            texldl r0, o0, s0

            ?

            // HLSL / Cg 代碼

            sampler2D tex;

            vDisplacement = tex2Dlod ( tex, t ); // t.w 包括 MIPMAP LOD 數(shù)據(jù)

            ?

            OPENGL

            ?

            ????? VP 的紋理查找功能通過 TEX,TXB, TXL or TXP 實(shí)現(xiàn),就像在 Fragment Shader 里一樣(或者在其他高等級語言中比如 CG 。與 Fragment Shader 的差異是 , 紋理查找功能無法自動(dòng)計(jì)算 LOD

            ????? LOD 的意義是確定紋理在屏幕上縮放的尺寸大小。一般根據(jù)紋理坐標(biāo)象素的改變頻率計(jì)算,但這里的麻煩是, Vertex Texture 由頂點(diǎn)訪問,硬件很難計(jì)算 LOD 值。所以你不得不自己在 Vertex Processing 里計(jì)算 LOD

            ????? MIPMAP 類似普通的 Pixel Shader 紋理,它可以為 Vertex Texture 在性能與畫質(zhì)之間折中。早期的圖形處理管線中沒有 Pixel-Level 這一概念,無法計(jì)算頂點(diǎn)紋理的 LOD 。如果需要使用LOD我們不得不人工在 Vertex Shader 里計(jì)算 mipmap

            ????? 示例代碼如下:

            ????? #define maxMipLevels 10.0f

            Out.HPOS = mul( ModelViewProj, vPos );

            float mipLevel = ( Out.HPOS.z / Out.HPOS.w ) * maxMipLevels;

            float vDisplacement = tex2Dbias( tex, float4( t, mipLevel, mipLevel );

            ????? 這是根據(jù)頂點(diǎn)的深度計(jì)算 LOD 的算法,開銷很小,精度能夠讓人滿意。

            ?????

            #define maxMipLevels 10.0f

            Out.HPOS = mul( ModelViewProj, vPos );

            float mipLevel = ( Out.HPOS.z / Out.HPOS.w ) * maxMipLevels;

            float mipLevelFloor = floor(mipLevel);

            float mipLevelCeiling = mipLevelFloor + 1;

            float mipLevelFrac = frac(mipLevel);

            float vDisplacementFloor = tex2D( tex, float4( t, mipLevelFloor,mipLevelFloor );

            float vDisplacementCeiling = tex2Dbias(tex,

            float4( t,mipLevelCeiling,mipLevelCeiling );

            float vDisplacement = vDisplacementFloor + vDisplacementCeiling

            ?

            Filter 過濾

            ????? Vertex Texture 允許紋理過濾,但是要根據(jù)硬件的支持情況。 6 系列只支持 NEAREST-NEIGHBOR 過濾模式。你也可以手動(dòng)在 Vertex Texture 里實(shí)現(xiàn)過濾。

            ?

            ?????????? Bilinear Filtering

            #define textureSize 512.0f

            #define texelSize 1.0f / 512.0f

            float4 tex2D_bilinear( uniform sampler2D tex, float2 t )

            {

            float2 f = frac( t.xy * textureSize );

            float4 t00 = tex2D( tex, t );

            float4 t10 = tex2D( tex, t + float2( texelSize, 0.0f );

            float4 tA = lerp( t00, t10, f.x );

            float4 t01 = tex2D( tex, t + float2( 0.0f, texelSize ) );

            float4 t11 = tex2D( tex, t + float2( texelSize, texelSize ) );

            float4 tB = lerp( t01, t11, f.x );

            return lerp( tA, tB, f.y );

            }

            ?????????? Bilinear Filtering With Mipmapping

            float4 tex2D_bilinear( uniform sampler2D tex, float4 t )

            {

            float2 f = frac( t.xy * miplevelSize );

            float4 t00 = tex2Dbias( tex, t );

            float4 t10 = tex2Dbias( tex, t + float4( texelSize, 0.0f, 0.0f, 0,0f );

            float4 tA = lerp( t00, t10, f.x );

            float4 t01 = tex2Dbias( tex, t + float4( 0.0f, texelSize, 0.0f, 0.0f ) );

            float4 t11 = tex2Dbias( tex, t + float4(texelSize, texelSize, 0.0f, 0.0f));

            float4 tB = lerp( t01, t11, f.x );

            return lerp( tA, tB, f.y );

            }

            ????? 如果單純站在性能的角度上考慮上述算法,還是 Bilinear 最好。 Bicubic Trilinear ,以及其他的過濾算法都可以在 Vertex Shader 里實(shí)現(xiàn)。其中, Trilinear 過濾對性能的要求要高一點(diǎn),因?yàn)?/span> Shader 需要從不同等級的 mipmap 里訪問紋理。

            ?

            Performance Tips 性能

            ?

            ????? 6800 可以在一秒鐘內(nèi)生成 6 億多個(gè)頂點(diǎn)。當(dāng)然,這是在 Vertex Shader 沒有任何“負(fù)載”的情況下測試的結(jié)果。如果使用 Vertex Texture Fetch 后是什么情況呢?我們的數(shù)字是每秒鐘生成 3 3 百多萬個(gè)位移頂點(diǎn),計(jì)算了基本位移,使用 NEAREST 方式過濾。

            ????? 3 3 百多萬個(gè)位移頂點(diǎn),意味著如果以每秒 30 幀的速度繪制畫面,每一幀畫面將有 100 多萬個(gè) Displacement Vertics 位移頂點(diǎn)。這比現(xiàn)在任何一款游戲在一幀畫面里出現(xiàn)的頂點(diǎn)都要多,而且,并不是每個(gè)頂點(diǎn)都需要進(jìn)行位移操作。你可以使用 6 系列 gpu 的動(dòng)態(tài)分支功能,對每個(gè)定點(diǎn)是否需要進(jìn)行位移操作進(jìn)行預(yù)測。比如做一次 dot(V,N) 運(yùn)算,測試頂點(diǎn)是否靠近陰影,如果遠(yuǎn)離陰影就可以避免位移操作。這時(shí),你就可以把節(jié)省下來的硬件資源用于處理過濾等效果上。我們推薦,如果你的 Vertex Shader 很復(fù)雜,最好在處理過程的早期就對畫面或頂點(diǎn)進(jìn)行剪裁與剔除。

            ?????????? // OpenGL example

            float4 vClipPos = mul( ModelViewProj, vPos );

            float3 bClip = abs( vClipPos.xyz ) < ( vClipPos.www + vClipOffset );

            if( all(bClip) )

            {

            DoLightingAndDisplacement( );

            }

            ????? 還有一點(diǎn)非常重要,“頂點(diǎn)紋理不應(yīng)看作連續(xù)的 RAM 。頂點(diǎn)紋理在提取數(shù)據(jù)時(shí)不是真正的連續(xù)讀取,而是會(huì)產(chǎn)生等待時(shí)間。因此使用頂點(diǎn)紋理的最佳方法就是先進(jìn)行紋理提取,然后進(jìn)行邏輯算法計(jì)算,這樣能在使用紋理提取前避免等待時(shí)間。頂點(diǎn)紋理不是用來代替大量的常量的陣列,而是用于減少頂點(diǎn)數(shù)據(jù),這樣每個(gè)頂點(diǎn)只有少量的頂點(diǎn)紋理需要提取數(shù)據(jù)。” —— 摘自《 GPU_Programming_Guide_Chinese From NVIDIA

            ?

            <Case Study>

            ????? 目前,一些游戲已經(jīng)開始使用 Vertex Texture 。比如下面要提到的這款游戲,由 Maddox GAME 開發(fā), Ubi Software 發(fā)行的 Pacific Fighter

            ????? 現(xiàn)代游戲的設(shè)計(jì)中,飛行模擬類游戲最適合使用 dm 技術(shù)。這是因?yàn)椋@些游戲的場景中包括大量的地形、河流、海洋等。 Dm 可以為這些場景提供更好的效果。讓我們看一下這款使用 Displacement Mapping 的游戲。

            ?????

            IL-2 Sturmovik 系列游戲最近年來比較成功的飛行模擬類游戲,在中國武漢曾經(jīng)進(jìn)行過一場國際性比賽。游戲制作人員非常留心游戲業(yè)里出現(xiàn)的最新技術(shù),并運(yùn)用到他們的作品中。比如這款最新的 Pacific Fighter ,完全發(fā)揮了 6 系列 gpu 的性能。“ Vertex Shader 里可以訪問紋理是 3D 加速硬件最值得期待的技術(shù)之一。” Yuri Kryachko ,主程序員如是說。

            ????? 在這款游戲中,海水的繪制非常重要。開發(fā)人員采用了 Vertex Texture ,實(shí)現(xiàn)了目前游戲領(lǐng)域中最真實(shí)的流水效果。在沒有采用 Vertex Texture 之前,開發(fā)人員一般使用凹凸貼圖模擬水面,但是與采用 Vertex Texture 和幾何位移算法實(shí)現(xiàn)的效果比起來有天壤之別。圖片對比如下。

            ????? ?????

            這款游戲的 WaterShader 非常復(fù)雜,超過 140 行,用于用物理的方式計(jì)算水面的動(dòng)畫,以及反射折射效果。每一個(gè)頂點(diǎn)的位移都是由多個(gè) dynamic normal maps (動(dòng)態(tài)向量映射)用幾何方式計(jì)算出來的。而且 Shader 從多個(gè)紋理中讀取數(shù)據(jù)進(jìn)行過濾操作,使畫面更加真實(shí)。

            ????? Yuri Kryacko 說,“當(dāng)我們在 Vertex Shader Pixel Shader 中同時(shí)使用動(dòng)態(tài)分支功能時(shí),性能得到了很大的提高。我們想再優(yōu)化代碼,使用新的 Shader ,提高整體的畫質(zhì),使我們的引擎的真實(shí)性達(dá)到一個(gè)新的高度。”

            ?

            Downloads 下載

            ????? 想學(xué)習(xí)關(guān)于 Vertex Texture Fetch 更多的東西嗎?從 NVIDIA 的站點(diǎn)上下載范例吧

            ????? http://download.nvidia.com/developer/SDK/Individual_Samples/samples.html

            http://download.nvidia.com/developer/SDK/Individual_Samples/effects.html

            posted on 2006-11-16 23:57 李錦俊(mybios) 閱讀(1751) 評論(0)  編輯 收藏 引用 所屬分類: Direct3D
            久久亚洲精品视频| 成人国内精品久久久久一区| 久久精品男人影院| 国产V亚洲V天堂无码久久久| 国产精品无码久久四虎| 99久久精品国产一区二区| 国产精品狼人久久久久影院| 亚洲人成网亚洲欧洲无码久久| 久久99亚洲综合精品首页| 国产成人精品久久一区二区三区av| 欧美国产成人久久精品| 伊人久久大香线蕉AV色婷婷色| 国产精品伊人久久伊人电影| 久久国产欧美日韩精品| 久久综合久久综合久久综合| 亚洲精品乱码久久久久久蜜桃图片| Xx性欧美肥妇精品久久久久久 | 99久久婷婷国产一区二区| 亚洲国产精品无码久久久蜜芽 | 亚洲色欲久久久综合网东京热| 99热精品久久只有精品| 久久国产精品国产自线拍免费| 亚洲人成伊人成综合网久久久| 国产欧美久久久精品影院| 久久精品这里只有精99品| 久久精品国产男包| 狠狠色丁香久久婷婷综合五月| 久久精品国产亚洲αv忘忧草 | 欧美亚洲色综久久精品国产| 色综合久久久久网| 国产亚洲综合久久系列| 久久婷婷激情综合色综合俺也去| 亚洲色婷婷综合久久| 久久精品国产99久久久古代| 久久SE精品一区二区| 久久WWW免费人成一看片| 成人久久免费网站| 日韩精品久久久久久久电影蜜臀| 久久丫精品国产亚洲av不卡| 国内精品人妻无码久久久影院| 99久久中文字幕|