Vertex Shader结构
现在你对如何编写vertex shader已经有了一个抽象的概念,接下来,我将介绍3种编译vertex shader的方法。编译Vertex ShaderOpenGL解析的是字符串,而Direct3D使用的是二进制字节。因此,Direct3D开发者需要使用编译器编译vertex shader。这可以帮助你尽早的在开发周期中发现bug,并且它也缩短了load时间。我了解有3中方法可以编译一个vertex shader:[*]将vertex shader源代码写入到一个单独的ASCII文件中例如test.vsh,然后使用Vertex shader编译器将它编译成一个二进制文件,例如test.vso。编译后的文件将会在游戏开始后被读进来。使用这种方法,就不是每一个人都可以看到你的vertex shader源文件了。NVLink可以在运行期将已经编译过的shader段连接到一起。
[*]当vertex shader源文件在一个ASCII文件或者以cpp文件中一个字符串形式出现时,你可以在程序启动后用D3DXAssembleShader*() 加载vertex shader。
[*]当vertex shader源文件在一个特效文件中,并被一个应用程序打开后。vertex shader可以使用 D3DXCreateEffectFromFile()来编译。通过这种方法也可以预编译vertex shader。使用这种方法的vertex shader大部分处理都很简单并且被特效文件的函数所调用。还有一个方法就是使用在d3dtypes.h中的操作码,写一个自己的vertex编译/反编译器。
让我们复习一下,看看我们已经学过了什么:
[*]使用D3DCAPS8::VertexShaderVersion 检查vertex shader是否被支持
[*]使用D3DVSD_* 宏来定义vertex shader
[*]使用SetVertexShaderConstant() 来设置常量寄存器
[*]编写并编译vertex shader
现在让我们来学习如何得到一个vertex shader句柄并调用它。创建Vertex ShaderCreateVertexShader() 函数用于创建一个vertex shader并使之生效:HRESULT CreateVertexShader( CONST DWORD* pDeclaration, CONST DWORD* pFunction, DWORD* pHandle, DWORD Usage);这个函数的第一个参数是指向以前定义的vertex shader的指针,并且返回一个shader句柄在pHandle中。第二个参数pFunction指向使用D3DXAssembleShader() / D3DXAssembleShaderFromFile() 编译过或者已经用编译器编译过的vertex shader的二进制代码。你可以强制 设置第四个参数为D3DUSAGE_SOFTWAREPROCESSING 来强制使用软件vertex模式。如果D3DRS_SOFTWAREVERTEXPROCESSING 被设置成真,第四个参数必须被设置。通过显式的设置软件模拟,vertex shader被CPU通过CPU厂商提供的软件接口模拟。如果有一个可以使用shader的GPU,使用硬件shader将会大大的提高速度。如果在用NVIDIA Shader调试器时,你必须设置这个属性或者使用参考光栅化(reference rasterizer)。设置Vertex Shader在调用DrawPrimitive*() 绘画一个物体之前,你必须使用etVertexShader() 为这个物体设置一个vertex shader.这个函数在两个primitive调用之间被动态的调用.// set the vertex shaderm_pd3dDevice->SetVertexShader( m_dwVertexShader );使用SetVertexShader() 调用的 Vertex shader 次数将等同于顶点数。例如,如果你试着用索引的三角形列表模式旋转一个四个顶点的四方形,你可以在NVIDIA Shader调试器中看到,在DrawPrimitive*() 函数被调用之前vertex shader运行了4次。函数要传入的唯一参数就是你使用CreateVertexShader()创建的vertex shader句柄。这个函数调用的性能消耗相当的少,甚至比 SetTexture() 还低,所以可以经常的使用。释放Vertex Shader资源当一个游戏结束或者一个设备改变了,vertex shader拥有的资源必须被释放。这通过调用DeleteVertexShader() 来完成:// delete the vertex shaderif (m_pd3dDevice->m_dwVertexShader != 0xffffffff){m_pd3dDevice->DeleteVertexShader( m_dwVertexShader );m_pd3dDevice->m_dwVertexShader = 0xffffffff;}概要现在我们已经大致了解了vertex shader的创建过程。让我们看一下迄今为止我们所学到的东西:
[*]为了使用vertex shader,你必须检查你的最终用户电脑中所安装的软件或者硬件vertex shader接口 ,这可以通过检查 D3DCAPS8::VertexShaderVersion来实现。
[*]你必须要定义好,哪一个顶点属性或者哪个顶点数据被映射到哪个输入寄存器。这个定义由D3DVSD_* 宏来完成。你还可以使用SetVertexShaderConstant() f或者提供的宏来设置vertex shader的常量寄存器。
[*]当你准备好了任何东西并且已经写了一个vertex shader,你可以编译它,然后通过CreateVertexShader() 得到它的句柄,并最后调用SetVertexShader() 执行它。
[*]为了释放vertex shader所申请的资源,你必须在游戏结束时调用DeleteVertexShader()释放这些资源。
下一章内容在下一个章节"Vertex Shaders编程”中我们将开始编写我们自己的vertex shader。并且我们将讨论基本的光照算法和如何调用它们。参考文献 Steffen Bendel, "Smooth Lighting with ps.1.4", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 Dean Calver, "Vertex Decompression in a Shader", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 David Gosselin, "Character Animation with Direct3D Vertex Shaders", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 Kenneth Hurley, "undefinedhoto Realistic Faces with Vertex and Pixel Shaders", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3, John Isidoro, David Gosselin, "Bubble Shader", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 Scott Le Grand, Some Overlooked Tricks for Vertex Shaders, ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 Kim Pallister, "Optimizing Software Vertex Shaders", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 Steven Riddle, Oliver C. Zecha, "undefinederlin Noise and Returning Results from Shader Programs", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 John Schwab, "Basic Shader Development with Shader Studio", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 Alex Vlachos, Jörg Peters, Chas Boyd and Jason L. Mitchell, "Curved PN Triangles", ACM Symposium on Interactive 3D Graphics, 2001 (http://www.ati.com/na/pages/resource_centre/dev_rel/CurvedPNTriangles.pdf).其他资源A lot of information on vertex shaders can be found at the web-sites of NVIDIA (developer.nvidia.com) and ATI (http://www.ati.com/). I would like to name a few:
AuthorArticlePublished at
Richard HuddyIntroduction to DX8 Vertex ShadersNVIDIA web-site
Erik Lindholm, Mark J Kilgard, Henry MoretonSIGGRAPH 2001 -- A User Programmable Vertex EngineNVIDIA Web-Site
Evan Hart, Dave Gosselin, John IsidoroVertex Shading with Direct3D and OpenGLATI Web-Site
Jason L. MitchellAdvanced Vertex and Pixel Shader TechniquesATI Web-Site
Philip TaylorSeries of articles on Shader Programminghttp://msdn.microsoft.com/directx
Keshav B. ChannaGeometry Skinning / Blending and Vertex Lightinghttp://www.flipcode.com/tutorials/tut_dx8shaders.shtml
Konstantin MartynenkoIntroduction to Shadershttp://www.reactorcritical.com/review-shadersintro/review-shadersintro.shtml
致谢I'd like to recognize a couple of individuals that were involved in proof-reading and improving this paper (in alphabetical order):
[*]David Callele (University of Saskatchewan)
[*]Jeffrey Kiel (NVIDIA)
[*]Jason L. Mitchell (ATI)
好!~~~~ 好东西!支持一下 顶......
楼下跟上..... 路过!!!
不发表意见…… 顶起来………… (*^__^*) 嘻嘻…… 顶......
楼下跟上..... 顶......
楼下跟上..... 顶!!!!!!!!!!!!!!!!!!!!!!!!! (*^__^*) 嘻嘻…… (*^__^*) 嘻嘻…… 路过!!!
帮顶…… (*^__^*) 嘻嘻…… 路过!!!
不发表意见…… 顶!!!!!!!!!! 路过 看看
页:
[1]
2