




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园自考试题及答案
- 2023年度施工员常考点试卷含完整答案详解【必刷】
- 粮油食品检验人员考前冲刺练习试题含完整答案详解(历年真题)
- 幼儿园培训结业考试题及答案
- 黄石市烟草公司2025秋招合规管理岗位高频笔试题库含答案
- 员工活动策划与组织方案
- 营销职称考试题库及答案
- 英语六下考试题及答案
- 劳动合同签署法律注意
- 劳动合同解除法律依据
- 《第3课 数据的价值》参考课件1
- 2025届高考试题原创命题比赛说题稿
- 2024年四川省大竹县级机关和事业单位考调人员75人历年(高频重点提升专题训练)共500题附带答案详解
- 小学道法小课题研究活动记录
- 湖南省建筑工程定额
- 《外科护理》课程标准
- 党风监督员培训课件
- (2024年)人才培养计划方案
- 《UI设计》课件-第1章:UI设计概述
- 国开Python语言基础形考理论考核1-4答案
- 《招标投标法》课件
评论
0/150
提交评论