EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2333|回复: 27
打印 上一主题 下一主题

Vertex Shader结构

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-9 14:33:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在你对如何编写vertex shader已经有了一个抽象的概念,接下来,我将介绍3种编译vertex shader的方法。
编译Vertex Shader
OpenGL解析的是字符串,而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 Shader
CreateVertexShader() 函数用于创建一个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
[Vlachos01] 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:
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):
  • David Callele (University of Saskatchewan)
  • Jeffrey Kiel (NVIDIA)
  • Jason L. Mitchell (ATI)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12404

社区QQ达人

推荐
 楼主| 发表于 2016-8-22 10:01:12 | 只看该作者
  好!~~~~
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

1

主题

250

帖子

1069

积分

BIM项目负责人

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

积分
1069

社区QQ达人

推荐
发表于 2015-8-7 10:37:33 | 只看该作者
好东西!支持一下

26

主题

722

帖子

-2205

积分

乞丐

积分
-2205
4F
发表于 2014-2-27 14:55:12 | 只看该作者
顶......
楼下跟上.....

5

主题

884

帖子

1541

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1541
5F
发表于 2014-3-5 16:50:38 | 只看该作者
路过!!!
不发表意见……

12

主题

821

帖子

1427

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1427
7F
发表于 2014-3-26 16:12:41 | 只看该作者
(*^__^*) 嘻嘻……

8

主题

877

帖子

1362

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1362
8F
发表于 2014-3-26 16:14:02 | 只看该作者
顶......
楼下跟上.....

5

主题

843

帖子

1376

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1376
9F
发表于 2014-3-26 16:16:43 | 只看该作者
顶......
楼下跟上.....

13

主题

730

帖子

1691

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1691
11F
发表于 2014-4-1 10:54:01 | 只看该作者
(*^__^*) 嘻嘻……

12

主题

854

帖子

1923

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1923
12F
发表于 2014-4-1 10:56:49 | 只看该作者
(*^__^*) 嘻嘻……

2

主题

871

帖子

1314

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1314
14F
发表于 2014-5-14 14:26:12 | 只看该作者
(*^__^*) 嘻嘻……

23

主题

793

帖子

1941

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1941
15F
发表于 2014-5-14 14:31:33 | 只看该作者
路过!!!
不发表意见……
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-23 10:22

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表