RenderMonkey基本使用方法_第1頁
RenderMonkey基本使用方法_第2頁
RenderMonkey基本使用方法_第3頁
RenderMonkey基本使用方法_第4頁
RenderMonkey基本使用方法_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、RenderMonkey基本使用方法楔子:差不多從年中開始由于工作需要開始研究Direct3D,這是繼大二開始自學X開始,睽違了6年后再重新學習DX。雖然時間很久了,但是幸虧還是有點基礎,所以上手還是比較順利的。當然由于DX本身難度就比較大,再經過了一兩個月的熟悉后后來發現剛開始寫的代碼很累贅很復雜且不知所以所以說脫離實際的自學與實際中根據目標的自學所學到的東西是完全兩碼子事兒,這就是所謂“的博學而篤志,近問而切思,仁在其中”矣,不要好高騖遠,不要脫離實際。好了,廢話說了這么多,該說正經的了。在重新出發學X的時候,尤其是Shader的時候,因為隱約記得大學自學的時候并沒有接觸這一塊所,以上手就

2、稍微費力了一點,特別是關于Shader的資料很難找到入門級的,大多數都在XSDK中零星的分布。當然這里我并不想也沒有那個水平去寫一篇hader的教程,只是想分享一下自己在學習hader過程中使用到的一個工具VMD的RenderMonkey。關于RenderMonkey的使用,最基本的當然是參看其自帶的DK文檔了,但是這個SDK除了介紹RenderMonkey的使用方法外,幾乎沒有其它與Shader相關的部分,這是很痛苦的n后來從網上狗狗也只找到些許RenderMonkey相關的文章,當然寫的很好,有基礎入門的,也有提高篇的,但是有個唯一的缺點就是,它們使用的都是老版本的RenderMonkey

3、,而我現在則使用4MD最新版本的RenderMonkey,其界面和使用方法與老版本是有一定差異的,所以只有靠自己摸索了。下面正式開始/華麗的分割線/首先,從AMD開發者網站上下載最新版本的RenderMonkey,截至到本文發布之時,可以下到1.82版本的RenderMonkey。安裝很簡單,一路Next下去就OK。雙擊運行,彈出的Splash,果然就是一只猴子,囧程序的界面,嗯,長的和VC6很像嘛!EffectWorkspace就和VC6中的Solution的概念相似,即可以在這個名為EffectWorkspace的解決方案下添加不同的“Project”。當然,在RenderMonkey中E

4、ffectWorkspace是作為“根(Root)節點出現的,其下可以添加其它的子節點,這點上并不像VC的Project了。現在可以嘗試在“EffectWorkspace”這個根節點下添加其它的子節點,就是在這個根節點上點擊鼠標右鍵,會發現彈出一個多級菜單,這其中有許多選項我都不打算去觸碰,因為我也沒有完全搞清楚;:。現在先來看看“AddEffectGroup,其實這個很像VC6中添加一個文件夾,其實只是為了方便管理代碼而已,本身不會影響代碼的運行。回想在VC中,當我們創建一個空的Project后,可以自己添加.h/.cpp/.rc。但如果我們使用了VC自帶的工程向導的話,就很簡單地就可以創建

5、一個應用程序,例如一個基于MFC的對話框程序等等,然后我們就可以在這個工程上根據自己的需要修改相應的.h/.cpp來實現自己所需要的功能。同樣地,在RenderMonkey也有類似的操作,你既可以在一個空的EffectWorkspace上單獨添加一個一個節點,也可以直接使用RenderMonkey提供的默認所謂的“DefaultEffect”,然后我們在這個DefaultEffect上根據自己的需要進行修改。這里,我們使用RenderMonkey默認的最簡單的DX效果AddDefaultEffect-DirectX-DirectX。經過這樣的操作后,可以看到在渲染窗口中出現了一個紅色的球體。展

6、開Default_Direct_Effect節點后的結果也如圖所示,可以看到有很多奇怪的節點圖標,下面就一一為您詳解(還請先閱讀一下RenderMonkey的SDK文檔了解相關知識)matViewProjection是RenderMonkey提供的預定義變量(類型為4*4矩陣),之所以知道是預定義,是因為這個圖標左下角有一個綠色的P字母,代表PreDefined。這里出現的matViewProjection節點相當于固定管線中聲明并定義了一個4*4的矩陣變量。接下來的StreamMapping節點不知道翻譯為流映射節點是否合適?該節點的作用是綁定數據流到輸入寄存器中供shaders使用。Ren

7、derMonkey將會直接使用來自模型的數據來自動產生這個流(例如前面我們下面將要講到的Model節點就只有位置信息,那么如果你雙擊這個StreamMapping節點,就會看到POSITION信息了。)或者你通過用戶接口來定義流通道,然后由應用程序獲取和輸出該流中的信息。按照我的理解,這個StreamMapping實際上對應了固定管線中聲明FVF的過程,而下面的流映射參考節點(StreamMappingReference)則對應了固定管線中的IDirect3DDevice9:SetFVF函數的功能。Model節點是做什么的呢?一個Effect要通過一個幾何模型才能過表現出來,即要有一個載體。R

8、enderMonkey用模型(Model)和模型參考(ModelReference)節點來允許用戶指定哪個模型被渲染。按照我的理解,設置Model節點就是固定管線中的根據FVF創建頂點緩沖并對其賦值的過程,而ModelReference則是固定管線中IDirect3DDevice9:SetStreamSource的調用,指示當前的渲染對象是哪些頂點(這些Vertext即構成了這里的Model)。一個效果至少要有一個Pass(這說明RenderMonkey中的效果實際上也和固定管線中IEffect的概念一樣),默認為Pass0。在Pass節點中包含的大多是引用類型的節點(除了Shader之外)。

9、Pass中一般有兩個Shader:VertexShader和PixelShader,分別代表頂點著色器和像素著色器,這兩個節點是整個Effect中最重要也是唯一需要編寫代碼的地方。在VertexShader中:首先聲明了一個類型為float4x4的全局變量matViewProjection,可以看到這個變量的名字和左邊Workspace內的matViewProjection節點的名字一樣,這并不是巧合!回想在固定管線中向Shader傳送變量的過程,我們首先從IEffect接口中獲取Shader中某個全局變量的對應的D3DXHANDLE,然后就可以向這個D3DXHANDLE中傳遞參數(被映射到S

10、hader的全局變量上),而這個參數最終被用在Shader中。在RenderMonkey中,沒有固定渲染管線這個玩意兒,那么它是怎樣實現向Shader中傳入參數的操作的呢?答案就是Workspace中的變量節點和Shader中定義的全局變量是同名名字。就是說如果你想在Shader中使用外部傳入的變量參數的話,就必須聲明一個名字和類型都和Effect節點下一致的節點,而我們在Workspace中是可以直接雙擊某個可編輯的節點進行編輯的(當然這個節點必須是可以被編輯的”,而例如RM預定義的那些變量就是不可被編輯的),那么就相當于實時的改變了Shader中相應的全局變量。PixelShader的用法

11、也大概和VertexShader和一樣。在Effect中添加一個紋理也是很簡單的,例如如果想添加一個2D紋理,那么就直接AddTexture-Add2DTexture-2DTexture(這里不使用RM資源庫中預先定義好的紋理),這樣就創建了一個空的紋理,而如果想將其綁定到某個圖像文件,就可以直接雙擊該節點并選擇一個圖像即可。這一步就相當于固定管線中的D3DXCreateTextureFromFile樣。類似于模型參考和流映射參考,我們還需要在Pass中添加一個紋理對象(TextureObject,為什么不叫TextureReference呢?不曉的),并將其指向剛剛創建的紋理。感覺這一步就像

12、是固定管線中的IDirect3DDevice9:SetTexture樣。而雙擊這個紋理對象后,就更會發現一些與固定管線中函數SetSamplerState和SetTextureStageStatus相似的東東了,而且可以對它們進行設置,就像SetSamplerState和SetTextureStageStatus所做的事情一樣。AMDRenderMonkey1.82-TextureStateEditorDefault_DirectX_Effect_5X11WorkspaceX-葩EffectWorkspace冃&Default_DirectX_Effect菱劉matViewProjection

13、Srny2DTexture畫込韓StreamMapping*ModelU白Pass0證Model洌VertexShader記|PixelShader-bxtureO畫遢圉my2DTexture倉透|師StreamMappingFileEditViewWindowHelpDirectX9.0Pre.X_Effecteffect|ShaderEdito:._DirectX_EffectTextureStateE._DirectX_Effect|GetRenderTarget(0,&pOldRenderTarget);g_pRenderTarget-GetSurfaceLevel(0,&pRende

14、rSurface);g_pD3D9Device-SetRenderTarget(0,pRenderSurface);g_pD3D9Device-Clear(0,0,D3DCLEARTARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_X#000000,1,0);RenderMonkey中并沒有顯式的獲取OldRenderTarget和恢復OldRenderTarget的過程,但是這卻是固定管線中必須有的,所以可以肯定RenderMonkey也一定做了相同的動作,只是不給我們看而已。渲染完RenderTarget后,就需要回到原來的幀緩存中(即調用IDirect3D9Device:S

15、etRenderTarget將原來保存的OldRenderTarget恢復回去,這一步在RenderMonkey里面是看不到的),并將已經渲染好的RenderableTexture設置到設備的某個紋理層上即可。在RenderMonkey中表現為在第二個Pass中(注意,該Pass的Index號必須比上述渲染RenderTarget的Pass要大,即一定要先渲染RenderTarget再渲染幀緩存),創建一個普通的紋理對象AddTextureObject并將其指向RenderableTexture,就和使用普通的紋理一樣。多個RenderTarget的渲染和單個比起來并沒有什么不同,只是多了幾個

16、節點而已。但是有一點要強調的是當在一個Pass中出現多個紋理對象的時候,它們實際上是安裝多層紋理而不是多次紋理來渲染的,因為當我們把鼠標移動到TextureObject節點上時候可以看到會提示到“TextureStagex,其中x為0開始的數字,這難道不會讓你聯想到固定管線中的SetTexture的第一個參數或者SetTextureStage函數么?OK,關于RenderMonkey的幾個基本節點(實際上個人才疏學淺,目前也只了解這些了)就到此到一段落了。以后有時間再講講如何將RenderMonkey中編寫好的Shader文件直接交予應用程序使用,因為畢竟使用RenderMonkey來設計編寫調試Shader代碼是比較方便的參考資料:RenderMonkeyToolsuite HYPERLINK /gpu/rendermonkey/Pages/default.aspx /gpu/rendermonkey/Pages/default.aspx用RenderMonkey進行shader開發 HYPERLINK /ArticleShow.as

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論