VertexShader入门

简介:

Shader与固定管线

顶点着色(Vertex Shader)是一段执行在GPU上的程序(一般用HLSL来编写),用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。

有图则一目了然。

2010081317345951.jpg

Vertex Shader做了什么工作

由上图知,Vertex Shader对输入顶点完成了从local space到homogeneous clip space的变换过程,homogeneous clip space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。

优点(与fixed pipeline比较)

由于Vertex Shader是用户自定义程序,所以有很大的灵活性,不必再局限于D3D固定的算法,可以应用许多其他算法,比如可以操作顶点位置模拟衣服效果,操作顶点大小模拟例子系统及顶点混合,变形等,此外,顶点的数据结构也更加灵活。

Shader代码文件

Shader代码可以用纯文本文件来保存,比如记事本文件。我们来看一个最简单的Shader文件,该文件完成的功能是,将顶点由Local Space变换到Homogeneous Space,编辑Shader文件可以用DirectX的Effect Edit,不过新版SDK中没有这个工具了,另外显卡厂商也有自己的编辑器,NVIDIA 有FX Composer,ATI有Render Monkey。

ContractedBlock.gif 代码

简单解释一下上述代码

第一行定义了一个全局变量gWVP,这个变量的命名是有规则的,g表示global,即全局变量,W表示World,V表示View,P表示Projection,也就是说这是World,View和Projection矩阵的乘积。但是在程序中我们并没有用到World矩阵,所以实际上就是View矩阵和Projection矩阵的乘积。uniform表示这是个常量,也就是在Shader执行的过程中这个量是不能改变的,extern表示这是一个外部输入量,全局变量默认就是uniform extern的。

接下来的Struct定义了顶点的输出格式,所谓输出就是有VertexShader操作完以后,顶点以何种方式呈现给下一级处理器(一般是Pixel Shader)。这里的输出格式很简单,只包含一个信息,就是顶点的位置。

最后的Main函数就是主要的处理过程,需要注意的是这个函数的名字要和程序中指定的名字保持一致,否则编译会失败。首先定义一个输出结构并清零,然后就是顶点变换,使用mul函数将顶点从Local Space变换到 Homogeneous Space。注意输入顶点是三维的,而齐次坐标是四维的,所以需要转换一下。

如何使用Shader

有了上面的Shader文件,我们就可以在程序中使用它了,下面将以逐步添加代码的方式讲述如何使用Shader文件,为了简化程序,我们将着重讲述有关Shader的代码,其他代码简单带过。

1.定义一个VertexShader指针,该指针可以用来用来保存编译后的Shader

 
 
IDirect3DVertexShader9 * g_pVertexShader = NULL ; // vertex shader

2. 定义一个常量表指针,常量表用来保存Shader文件中的变量,这些变量是Shader文件与C++ code通讯的媒介,比如我们要设置某些渲染状态,那么首先要通过程序修改这些变量,然后Shader文件读取这些变量就可以得到修改后的值。

 
 
ID3DXConstantTable * g_pConstantTable = NULL ; // shader constant table

3. 定义一个函数PrepareVertexShader,该函数用来编译Shader文件并做一些必要的设置,这个函数主要做两件事,一是从编译Shader文件,二是在编译完成后创建相应的Shader,每个步骤后面都有对应的错误处理,如果编译有错误,则输出错误信息,如果创建Shader失败也通知用户。当创建完Shader以后,就释放codeBuffer和errorBuffer。

ContractedBlock.gif 代码

4. 设置View Matrix和Projection Matrix。

单独定义一个函数用来设置矩阵,然后对View Matrix和Projection Matrix做乘积,最后通过常量表将乘积矩阵传递给Shader。Shader中通过这个矩阵来变换顶点,这就是本文的核心了。

ContractedBlock.gif 代码

5 渲染,在Render函数中设置VertexShader,然后就可以渲染了。

ContractedBlock.gif 代码

下面是完整的代码

ContractedBlock.gif 代码

 

如何查看显卡所支持的Vertex Shader版本

1 使用DirectX Caps Viewer查看

2 使用下面的代码查看

ContractedBlock.gif 代码

 


本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2010/08/13/1799200.html,如需转载请自行联系原作者

相关文章
|
1月前
|
编译器 C++
【c++】入门4
【c++】入门4
23 2
|
1月前
|
存储 安全 编译器
c++入门
c++入门
43 0
|
27天前
|
Kubernetes 开发工具 Docker
K8S 极速入门
K8S 极速入门
50 0
|
6月前
|
存储 编译器 C语言
C++11入门
C++11入门
59 1
|
10月前
|
Web App开发 移动开发 IDE
laya入门,这一篇应该够了
laya入门,这一篇应该够了
3578 1
|
11月前
|
存储 安全 编译器
【C++】C++入门-1
【C++】C++入门-1
|
程序员
三字棋基本入门
三字棋基本入门
82 0
三字棋基本入门
|
存储 安全 Linux
C++11 入门
C++11 入门
95 0
C++11 入门
|
存储 安全 编译器
【C++】C++入门(下)
【C++】C++入门(下)
【C++】C++入门(下)
|
存储 编译器 程序员
【C++】C++ 入门(3)
【C++】C++ 入门(3)
68 0
【C++】C++ 入门(3)