青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

芳草春暉

偶爾記錄自己思緒的地方...

 

GPU程序在GameByro中的使用(轉(zhuǎn))

鏈接:http://www.shnenglu.com/rise-worlds/archive/2009/04/22/80699.html

引言:

GameBryo擁有一套復(fù)雜的材質(zhì)系統(tǒng),這套材質(zhì)系統(tǒng)可以根據(jù)渲染對象的狀態(tài)和屬性生成不同的shader代碼,提高了渲染流程的適應(yīng)性,可以使你定義一套材質(zhì)能適應(yīng)多種渲染對象。同時(shí),GameByro將shader的初始化和使用插件化,方便與美術(shù)工具集成,并且實(shí)現(xiàn)了平臺(tái)無關(guān)性。為了實(shí)現(xiàn)這些目的,GameByro使用了一套復(fù)雜的機(jī)制,本文主要解析GameByro如何生成、編譯并使用shader代碼。

Shader

GameBryo的shader的接口封裝在NiShader中,頂點(diǎn)數(shù)據(jù)流聲明,常量表的訪問,渲染狀態(tài)的設(shè)置都是通過這個(gè)類(有點(diǎn)類似于D3Deffect)。在程序運(yùn)行NiShader是由NiShaderFactory負(fù)責(zé)管理的,NiShaderFactory通過NiShaderLibrary從文件中創(chuàng)建shader,用全局性的map管理起來。NiShaderLibrary通過解析shader文本創(chuàng)建NiShader對象,并調(diào)用3D圖形接口編譯shader代碼,將這個(gè)類以dll的形式封裝,就可以作為插件來使用。NiShader類的創(chuàng)建可以通過解析文件來進(jìn)行,也可以通過C++的類來定制,只需從NiShader上繼承即可。GameByro為PC平臺(tái)提供了一個(gè)NiD3DXEffectShaderLib庫,這個(gè)庫提供了解析shader文件和初始化shader對象的功能。用戶只需按GameByro定義的格式編寫shader代碼的語意和注釋,NiD3DXEffectShaderLibrary就會(huì)根據(jù)文本來創(chuàng)建NiD3Dshader對象,在應(yīng)用程序中就可以通過Techinqe的名稱來訪問這個(gè)對象。通過這種機(jī)制,我們將shader文本文件放在相關(guān)美術(shù)工具指定的目錄下,在工具中就可以使用這些shader,并且能夠通過shader的語意和注釋為相關(guān)參數(shù)和變量生成UI,方便美術(shù)調(diào)試。

WIN平臺(tái)上的整個(gè)流程如下:

1. 應(yīng)用程序在啟動(dòng)時(shí)會(huì)先初始化整個(gè)shader系統(tǒng),接下來導(dǎo)入Shader解析庫和加載庫(dll的形式)。

2. 接下來應(yīng)用程序?qū)iD3DShader的初始化工作委托給NiShaderLibrary來處理,NiShaderLibrary首先通過NiD3DXEffectLoader載入所有的shader文本文件,并通過NiD3DXEffectParser解析文本生成NiD3DXEffectFile對象,同時(shí)NiD3DXEffectLoader還負(fù)責(zé)將shader代碼編譯成二進(jìn)制形式的GPU程序。

3. 最后由NiD3DXEffectTechnique負(fù)責(zé)通過NiD3DXEffectFile上的信息生成NiD3Dshader對象。

4. 所有的shader對象創(chuàng)建后,NiShaderLibrary的初始化就結(jié)束了,最后由NiShaderFactory負(fù)責(zé)統(tǒng)一管理。

材質(zhì):

NiMaterial為渲染對象生成和定義Shader,NiMaterialInstance為渲染對象分配 和Cach Shader。NiFragmentMaterial提供了一個(gè)Shader Tree框架,在它的繼承類中可以使用這個(gè)框架搭建shader tree。這個(gè)機(jī)制允許NiFragmentMaterial根據(jù)對象不同的渲染狀態(tài)生成不同的shader代碼,Cach在內(nèi)存中,并保存到磁盤文件。GameByro描述符的概念大量使用,包括前面提到的Shader解析過程也是通過描述符來傳遞信息。在材質(zhì)系統(tǒng)中主要使用了NiMaterialDescriptor和NiGPUProgramDescriptor這個(gè)兩個(gè)類做描述符,這兩個(gè)類中保存的信息是兼容的,都是為了描述某種材質(zhì)在渲染對象的某一特定渲染狀態(tài)下所對應(yīng)的GPU程序的特征。NiFragmentMaterial通過渲染目標(biāo)的狀態(tài)和屬性生成NiMaterialDescriptor,并通過NiMaterialDescriptor查找匹配的shader,如果找不到,則通過shader tree生成相應(yīng)的shader程序,并保存到磁盤文件中。當(dāng)下一次應(yīng)用程序啟動(dòng)時(shí)就可以通過這個(gè)文件直接創(chuàng)建NiShader對象。可以說通過NiFragmentMaterial生成的shader代碼是為特定的渲染對象在特定的情況下量身打造的。

整個(gè)過程的詳細(xì)流程如下:

1. 在每次渲染一個(gè)物體之前,NiMaterialInstance會(huì)先判斷這個(gè)物體的shader程序是否需要更新,如果不需要更新,就直接返回當(dāng)前Cach的NiShader;如果需要更新, NiMaterialInstance首先會(huì)根據(jù)物體的渲染狀態(tài)為其生成一個(gè)NiMaterialDescriptor,然后將這個(gè)NiMaterialDescriptor和當(dāng)前Cach住的NiShader進(jìn)行比較,如果匹配仍然返回當(dāng)前Cach的NiShader,如果不匹配,將獲得shader的工作轉(zhuǎn)交給NiMaterial進(jìn)行。

2. NiMaterial首先通過這個(gè)NiShaderFactory 查詢匹配這個(gè)NiMaterialDescriptor的NiShader,如果找不到,就通過NiMaterialDescriptor生成NiShader,同時(shí)生成一段Shader代碼,并保存到以shader描述符中的特征碼來命名對應(yīng)的shader文件。

3. 當(dāng)獲得相應(yīng)的NiShader對象后,NiMaterialInstance會(huì)調(diào)用NiShader的SetupGeometry接口,在這個(gè)接口中會(huì)進(jìn)行頂點(diǎn)聲明。

以下是NiMaterialInstance為Geometry選擇shader的代碼:

NiShader* NiMaterialInstance::GetCurrentShader(NiRenderObject* pkGeometry,

const NiPropertyState* pkState,

const NiDynamicEffectState* pkEffects)

{

if (m_spMaterial)

{

bool bGetNewShader = m_eNeedsUpdate == DIRTY;

if (m_eNeedsUpdate == UNKNOWN)

bGetNewShader = pkGeometry->GetMaterialNeedsUpdateDefault();

// Check if shader is still current

if (bGetNewShader && m_spCachedShader)

{

bGetNewShader = !m_spMaterial->IsShaderCurrent(m_spCachedShader,

pkGeometry, pkState, pkEffects, m_uiMaterialExtraData);

}

// Get a new shader

if (bGetNewShader)

{

NiShader* pkNewShader = m_spMaterial->GetCurrentShader(

pkGeometry, pkState, pkEffects, m_uiMaterialExtraData);

if (pkNewShader)

{

NIASSERT(m_spCachedShader != pkNewShader);

ClearCachedShader();

m_spCachedShader = pkNewShader;

if (!pkNewShader->SetupGeometry(pkGeometry, this))

ClearCachedShader();

}

else

{

ClearCachedShader();

}

}

m_eNeedsUpdate = UNKNOWN;

}

return m_spCachedShader;

}

如果想通過NiFragmentMaterial實(shí)現(xiàn)自己的shader tree就需要在NiFragmentMaterial提供的接口中實(shí)現(xiàn)自己拼裝代碼的邏輯,代碼塊由NiMaterialLibraryNode封裝,NiMaterialLibraryNode既可以直接寫C++代碼來定義,也可以先寫成XML腳本,再由專門的解析工具轉(zhuǎn)換成C++代碼。

由NiStandardMaterial生成的shader代碼文件如下圖所示:

clip_image002

文件名就是NiMaterialDescriptor的掩碼,用來標(biāo)識(shí)的shader代碼的行為。

Shader代碼的行為描述如下:

Shader description:

APPLYMODE = 1

WORLDPOSITION = 0

WORLDNORMAL = 0

WORLDNBT = 0

WORLDVIEW = 0

NORMALMAPTYPE = 0

PARALLAXMAPCOUNT = 0

BASEMAPCOUNT = 1

NORMALMAPCOUNT = 0

DARKMAPCOUNT = 0

DETAILMAPCOUNT = 0

BUMPMAPCOUNT = 0

GLOSSMAPCOUNT = 0

GLOWMAPCOUNT = 0

CUSTOMMAP00COUNT = 0

CUSTOMMAP01COUNT = 0

CUSTOMMAP02COUNT = 0

CUSTOMMAP03COUNT = 0

CUSTOMMAP04COUNT = 0

DECALMAPCOUNT = 0

FOGENABLED = 0

ENVMAPTYPE = 0

PROJLIGHTMAPCOUNT = 0

PROJLIGHTMAPTYPES = 0

PROJLIGHTMAPCLIPPED = 0

PROJSHADOWMAPCOUNT = 0

PROJSHADOWMAPTYPES = 0

PROJSHADOWMAPCLIPPED = 0

PERVERTEXLIGHTING = 1

UVSETFORMAP00 = 0

UVSETFORMAP01 = 0

UVSETFORMAP02 = 0

UVSETFORMAP03 = 0

UVSETFORMAP04 = 0

UVSETFORMAP05 = 0

UVSETFORMAP06 = 0

UVSETFORMAP07 = 0

UVSETFORMAP08 = 0

UVSETFORMAP09 = 0

UVSETFORMAP10 = 0

UVSETFORMAP11 = 0

POINTLIGHTCOUNT = 0

SPOTLIGHTCOUNT = 0

DIRLIGHTCOUNT = 0

SHADOWMAPFORLIGHT = 0

SPECULAR = 1

AMBDIFFEMISSIVE = 0

LIGHTINGMODE = 1

APPLYAMBIENT = 0

BASEMAPALPHAONLY = 0

APPLYEMISSIVE = 0

SHADOWTECHNIQUE = 0

ALPHATEST = 0

NiStanderMaterial就是根據(jù)這些掩碼的數(shù)據(jù)來生成shader代碼,用戶可以通過重載GenerateVertexShadeTree、GeneratePixelShadeTree、CreateShader這些接口來定義自己的shader生成規(guī)則。

增加自己的渲染效果:

通過前幾節(jié)我們可以了解到,想定義自己的材質(zhì),一是通過編寫shader代碼完成。在應(yīng)用程序初始化的時(shí)候,這些shader代碼會(huì)被初始化成NiShader對象,進(jìn)一步的通過NiShader對象來初始化NiSingleShaderMaterial對象,并分配給渲染對象。在GameByro默認(rèn)的渲染流程中,這些步驟都是自動(dòng)進(jìn)行的,美術(shù)只需在3DMAX插件中為幾何體的材質(zhì)指定Shader程序,導(dǎo)出到nif文件,應(yīng)用程序就能正確加載并渲染;二是定義自己的NiMaterialFragment類,在類中定義如何生成shader,在應(yīng)用程序運(yùn)行時(shí)只要將這個(gè)類的實(shí)例指派給幾何體,這個(gè)類就會(huì)自動(dòng)為幾何體生成shader。這兩種方式對于美術(shù)人員來說,主要區(qū)別在于,采用第一種方法定義的材質(zhì),其渲染數(shù)據(jù)的設(shè)置必須嚴(yán)格符合shader代碼中所需的數(shù)據(jù),否則就會(huì)報(bào)錯(cuò)。(比如說,頂點(diǎn)數(shù)據(jù)流必須嚴(yán)格符合shader程序的定義,必須為shader中每個(gè)采樣器提供格式正確的紋理);而采用第二種方法定義的材質(zhì),就有很高的容錯(cuò)和適應(yīng)性,但是這種容錯(cuò)性和適應(yīng)性需要自己寫代碼來完成,GameByro提供的NiStanderMaterial就提供了這套完整的機(jī)制。每個(gè)貼圖槽內(nèi)的貼圖如果你設(shè)置就會(huì)生成相應(yīng)的貼圖處理流程,如果不設(shè)置,就沒有這張貼圖的處理流程。

為了驗(yàn)證這個(gè)過程,筆者嘗試增加了一個(gè)自己的shader特效——SubSurfaceScattering,簡稱3s,其原理是模擬光在半透明物體中散射的效果。由于該效果無須預(yù)處理過程,所有的貼圖均來自磁盤文件,所以比較容易融合到GameByro工作流中。

筆者將在FX COMPOSER中調(diào)試通過的fx文件放入SDK中的SDK\Win32\Shaders\Data目錄下,在3DMAX的材質(zhì)面板選擇GameByroShader,然后就可在顯示shader的組合框中看到文件中定義的Techinqe,選擇點(diǎn)擊apply按鈕,就會(huì)出現(xiàn)自定義的參數(shù)調(diào)整界面。

clip_image004

clip_image006

通過調(diào)整參數(shù),最終得到皮膚和玉器的渲染效果如下:

clip_image007

皮膚

clip_image009

玉器

總結(jié)

GameByro的這套開發(fā)流程非常方便直觀,但是美術(shù)僅能為shader程序分配靜態(tài)的數(shù)據(jù)源,比如說光照圖等,CubeMap等;而一些在程序中實(shí)時(shí)生成的紋理數(shù)據(jù)則無法整合到美術(shù)工具中,比如說陰影圖、折射圖、反射圖等,這些都需要程序?qū)懘a來實(shí)現(xiàn)。調(diào)試起來就不大方便了。大部分情況下,我們只需要使用GameByro提供的NiStanderMaterial就可以完成大部分材質(zhì)的需求,特殊的效果可以自己寫shader或者通過引擎提供的shader庫來完成,只有當(dāng)我們需要即根據(jù)復(fù)雜的情況做很多不同的處理時(shí),我們才需要重載NiFragmentMaterial搭建自己的shader tree。不過搭建shader tree的程序一般比較復(fù)雜,編寫難度大,雖然引擎允許通過XML文件來編寫材質(zhì)節(jié)點(diǎn),但是使用起來仍然不方便。GameByro并沒有提供相關(guān)的后期處理的開發(fā)工具,后期處理的特效并不能所見即所得,這方面還需完善。

GameByro為幾何體在特定的環(huán)境下生成專用的shader代碼,具有一定的靈活性,但是也付出了以下代價(jià):

l 分析幾何體的屬性和當(dāng)前狀態(tài),為其生成shader代碼的過程有性能損耗。

l Shader代碼生成后會(huì)保存到磁盤文件中,這個(gè)過程如果不使用異步,可能會(huì)引起阻塞。

l 生成的NiShader對象會(huì)有內(nèi)存消耗。由于GameByro默認(rèn)的實(shí)現(xiàn)是將所有的shader文件初始化成NiShader對象,所以當(dāng)游戲運(yùn)行的時(shí)間久了以后會(huì)生成大量的shader文件,這時(shí)候內(nèi)存的消耗可能會(huì)很可觀,同時(shí)加載的時(shí)間也會(huì)增加。不過可以自己控制加載的流程,在這里進(jìn)行性能優(yōu)化。

 

作者:葉起漣漪

posted on 2010-04-19 21:53 CrazyDev 閱讀(485) 評論(0)  編輯 收藏 引用 所屬分類: 游戲引擎

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(1)

隨筆檔案

文章分類

文章檔案

C/C++

CEGUI

Friend Bog

Game Industry

Lua

OGRE

Other

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产成人精品女人久久久 | 亚洲精品一区二区三区蜜桃久| 欧美日韩福利| 欧美mv日韩mv国产网站| 欧美天堂亚洲电影院在线观看| 免费在线欧美黄色| 国产毛片一区二区| 一区二区欧美日韩| 亚洲国产精品精华液2区45| 欧美亚洲免费电影| 亚洲女人天堂成人av在线| 欧美成人伊人久久综合网| 免费视频一区二区三区在线观看| 国产噜噜噜噜噜久久久久久久久| av不卡在线| 中文一区字幕| 欧美日韩久久不卡| 亚洲精品国久久99热| 亚洲欧洲综合另类在线| 免播放器亚洲一区| 欧美大片在线观看一区| 在线日本成人| 久久中文欧美| 亚洲福利在线视频| 亚洲欧洲综合另类| 你懂的国产精品| 亚洲福利在线视频| 99精品视频免费| 欧美精品xxxxbbbb| 亚洲免费不卡| 亚洲欧美在线aaa| 国产免费亚洲高清| 欧美亚洲在线视频| 久久男女视频| 亚洲国产99精品国自产| 免费高清在线视频一区·| 欧美激情视频一区二区三区不卡| 在线观看欧美日韩| 欧美激情中文字幕乱码免费| 91久久精品久久国产性色也91| 亚洲三级性片| 欧美日韩在线不卡| 香蕉亚洲视频| 欧美成人国产| 一区二区三区精品久久久| 国产精品成人一区二区网站软件| 在线视频欧美一区| 久久久久九九九九| 亚洲大片在线| 欧美日韩第一页| 午夜久久99| 欧美大片免费观看| 亚洲手机视频| 精品88久久久久88久久久| 欧美不卡视频一区发布| 99视频超级精品| 久久久免费av| 99国产精品久久久久老师| 国产精品日本欧美一区二区三区| 欧美在线短视频| 亚洲国产欧美精品| 欧美亚洲视频在线看网址| 1000部精品久久久久久久久 | 久久综合色播五月| 亚洲精品一区二区三区在线观看| 欧美一级久久久久久久大片| 在线观看不卡av| 欧美视频一区在线观看| 久久久久久一区二区| 99在线热播精品免费| 美日韩精品视频免费看| 亚洲男人的天堂在线aⅴ视频| 激情视频一区二区| 国产精品免费一区豆花| 噜噜噜在线观看免费视频日韩| 亚洲视频图片小说| 欧美成人精精品一区二区频| 欧美一级久久久| 一区二区欧美在线| 亚洲国产国产亚洲一二三| 国产精品自拍三区| 欧美日韩国产三级| 免费久久99精品国产自| 欧美一区二区三区在线| 一区二区日韩免费看| 亚洲福利专区| 欧美成人激情在线| 久久久噜噜噜久久中文字幕色伊伊| 国产精品99久久99久久久二8| 亚洲国产欧美一区二区三区丁香婷| 国产精品亚洲美女av网站| 欧美日韩三级视频| 欧美激情一二三区| 欧美sm视频| 麻豆精品视频在线| 久久日韩精品| 欧美一区二区三区精品电影| 亚洲一区三区视频在线观看 | 久久久国产午夜精品| 亚洲性感激情| 国产精品99久久不卡二区| 亚洲日本va午夜在线电影| 欧美成人免费va影院高清| 久久人人97超碰国产公开结果| 久久av老司机精品网站导航| 校园激情久久| 欧美在线观看你懂的| 性欧美办公室18xxxxhd| 欧美一级在线视频| 午夜在线精品| 亚久久调教视频| 欧美一区二区视频免费观看| 午夜精品在线观看| 欧美一区二区三区在线免费观看 | 一区二区免费看| 亚洲视频一二区| 亚洲一区二区三区成人在线视频精品| 日韩视频在线观看一区二区| 99视频有精品| 亚洲女女女同性video| 亚洲欧美网站| 久久精品免视看| 欧美成熟视频| 欧美性事在线| 国产欧美日韩精品丝袜高跟鞋| 国产九区一区在线| 在线观看日韩专区| 亚洲乱码一区二区| 亚洲亚洲精品三区日韩精品在线视频| 亚洲手机在线| 久久久久中文| 亚洲国产精品成人综合| 这里只有精品视频在线| 午夜精品国产精品大乳美女| 久久久91精品国产| 欧美黄网免费在线观看| 国产精品成人在线观看| 国产视频一区在线观看| 亚洲人成网在线播放| 亚洲欧美日韩在线不卡| 久久青草欧美一区二区三区| 欧美激情精品久久久六区热门| 9色精品在线| 久久精品视频在线播放| 欧美日韩福利视频| 国产亚洲一级| 一区二区三区精品久久久| 久久久久久久久久码影片| 亚洲国产天堂久久综合| 亚洲欧美日韩精品久久亚洲区| 久久婷婷国产综合尤物精品| 欧美日韩综合| 在线激情影院一区| 亚洲欧美一区二区激情| 欧美国产在线电影| 欧美一区二区三区视频在线观看 | 亚洲欧美日韩国产一区| 久久综合免费视频影院| 夜夜嗨网站十八久久| 久久一区二区三区国产精品 | 久久伊人亚洲| 亚洲一区二区三区影院| 鲁鲁狠狠狠7777一区二区| 国产精品美女久久久久久2018| 亚洲三级观看| 老司机亚洲精品| 亚洲在线第一页| 男女av一区三区二区色多| 狠狠综合久久| 欧美中文字幕第一页| 99成人精品| 欧美极品aⅴ影院| 在线观看不卡| 久久久综合网| 欧美亚洲三区| 国产日韩高清一区二区三区在线| 亚洲天堂av综合网| 亚洲黄色影片| 欧美电影在线| 亚洲国产精品视频一区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲一区欧美激情| 国产精品成人免费| 亚洲深夜激情| 日韩一级在线| 欧美三级电影精品| 亚洲午夜日本在线观看| 亚洲日本一区二区三区| 免费成人在线观看视频| 亚洲国产精品成人综合色在线婷婷| 久久一区免费| 久久香蕉国产线看观看av| 国产在线观看一区| 浪潮色综合久久天堂| 久久精品国产亚洲5555| 国模 一区 二区 三区| 久久久久在线| 久久视频国产精品免费视频在线| 伊人色综合久久天天| 亚洲成人在线视频播放|