现在你对如何编写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。并且我们将讨论基本的光照算法和如何调用它们。 参考文献 [Bendel] Steffen Bendel, "Smooth Lighting with ps.1.4", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 [Calver] Dean Calver, "Vertex Decompression in a Shader", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 [Gosselin] David Gosselin, "Character Animation with Direct3D Vertex Shaders", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 [Hurley] Kenneth Hurley, "undefinedhoto Realistic Faces with Vertex and Pixel Shaders", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 [Isidoro/Gosslin], John Isidoro, David Gosselin, "Bubble Shader", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 [LeGrand] Scott Le Grand, Some Overlooked Tricks for Vertex Shaders, ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 [Pallister] Kim Pallister, "Optimizing Software Vertex Shaders", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 [Riddle/Zecha] Steven Riddle, Oliver C. Zecha, "undefinederlin Noise and Returning Results from Shader Programs", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 [Schwab] John Schwab, "Basic Shader Development with Shader Studio", ShaderX, Wordware Inc., pp ?? - ??, 2002, ISBN 1-55622-041-3 其他资源 Author | Article | Published at | Richard Huddy | Introduction to DX8 Vertex Shaders | NVIDIA web-site | Erik Lindholm, Mark J Kilgard, Henry Moreton | SIGGRAPH 2001 -- A User Programmable Vertex Engine | NVIDIA Web-Site | Evan Hart, Dave Gosselin, John Isidoro | Vertex Shading with Direct3D and OpenGL | ATI Web-Site | Jason L. Mitchell | Advanced Vertex and Pixel Shader Techniques | ATI Web-Site | Philip Taylor | Series of articles on Shader Programming | | Keshav B. Channa | Geometry Skinning / Blending and Vertex Lighting | | Konstantin Martynenko | Introduction to Shaders | |
致谢 I'd like to recognize a couple of individuals that were involved in proof-reading and improving this paper (in alphabetical order):
|