DirectX11 顶点着色器阶段
2015-09-29 21:28
405 查看
顶点着色器阶段
1. 顶点着色器阶段完成什么工作?
在完成图元装配后,顶点将被送往顶点着色器(vertex shader)阶段。顶点着色器可以被看成是一个以顶点作为输入输出数据的函数。每个将要绘制的顶点都会通过顶点着色器推送至硬件;实际上,我们可以概念性地认为在硬件上执行了如下代码:
顶点着色器函数由我们自己编写,但是它会在GPU上运行,所以执行速度非常快。
许多效果,比如变换(transformation)、光照(lighting)和置换贴图映射(displacement mapping)都是由顶点着色器来实现的。记住,在顶点着色器中,我们不仅可以访问输入的顶点数据,也可以访问在内存中的纹理和其他数据,比如变换矩阵和场景灯光。
我们将会在本书中看到许多不同的顶点着色器示例;当读完本书时,读者会对顶点着色器的功能有一个全面的认识。不过,我们的第一个示例会比较简单,只是用顶点着色器实现顶点变换。在随后的小节中,我们将讲解各种常用的变换算法。
2. 观察空间
XNA库提供了如下函数,根据刚才描述的过程计算观察矩阵:
通常,世界坐标系的y轴就是“向上”方向,所以“向上”向量j通常设为(0, 1,0)。举一个例子,假设摄像机相对于世界空间的位置为(5, 3, −10),目标点为世界原点(0, 0,0)。我们可以使用如下代码创建观察矩阵:
3. XMMatrixPerspectiveFovLH
透视投影矩阵可由如下XNA函数生成:
下面的代码片段示范了XMMatrixPerspectiveFovLH函数的使用方法。这里,我们将垂直视域角设为45°,近平面z设为1,远平面z设为1000(这些长度是在观察空间中的)。
横纵比要匹配窗口的横纵比:
1. 顶点着色器阶段完成什么工作?
在完成图元装配后,顶点将被送往顶点着色器(vertex shader)阶段。顶点着色器可以被看成是一个以顶点作为输入输出数据的函数。每个将要绘制的顶点都会通过顶点着色器推送至硬件;实际上,我们可以概念性地认为在硬件上执行了如下代码:
for(UINT i = 0; i < numVertices; ++i) outputVertex[i] = VertexShader(inputVertex[i]);
顶点着色器函数由我们自己编写,但是它会在GPU上运行,所以执行速度非常快。
许多效果,比如变换(transformation)、光照(lighting)和置换贴图映射(displacement mapping)都是由顶点着色器来实现的。记住,在顶点着色器中,我们不仅可以访问输入的顶点数据,也可以访问在内存中的纹理和其他数据,比如变换矩阵和场景灯光。
我们将会在本书中看到许多不同的顶点着色器示例;当读完本书时,读者会对顶点着色器的功能有一个全面的认识。不过,我们的第一个示例会比较简单,只是用顶点着色器实现顶点变换。在随后的小节中,我们将讲解各种常用的变换算法。
2. 观察空间
XNA库提供了如下函数,根据刚才描述的过程计算观察矩阵:
XMMATRIX XMMatrixLookAtLH( // Outputs resulting view matrix V FXMVECTOR EyePosition, // Input camera position Q FXMVECTOR FocusPosition, // Input target point T FXMVECTOR UpDirection); // Input world up vector j
通常,世界坐标系的y轴就是“向上”方向,所以“向上”向量j通常设为(0, 1,0)。举一个例子,假设摄像机相对于世界空间的位置为(5, 3, −10),目标点为世界原点(0, 0,0)。我们可以使用如下代码创建观察矩阵:
XMVECTOR pos = XMVectorSet(5,3,-10,1.0f); XMVECTOR target = XMVectorZero(); XMVECTOR up = XMVectorSet(0.0f,1.0f,0.0f,0.0f); XMMATRIXV = XMMatrixLookAtLH(pos,target,up);
3. XMMatrixPerspectiveFovLH
透视投影矩阵可由如下XNA函数生成:
XMMATRIX XMMatrixPerspective FovLH(// returns projection matrix FLOAT FovAngleY, // vertical field of view angle in radians FLOAT AspectRatio, // aspect ratio = width / height FLOAT NearZ, // distance to near plane FLOAT FarZ); // distance to far plane
下面的代码片段示范了XMMatrixPerspectiveFovLH函数的使用方法。这里,我们将垂直视域角设为45°,近平面z设为1,远平面z设为1000(这些长度是在观察空间中的)。
XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f*MathX::Pi, AspectRatio(),1.0f,1000.0f);
横纵比要匹配窗口的横纵比:
float D3Dapp::AspectRatio() const { return static_cast<float>(mClientWidth)/mClientHeight; }
相关文章推荐
- 第一个 只出现一次的字符 位置(剑指offer)+哈希
- Handler消息机制源码解析
- http通信原理
- 五种开源协议(GPL,LGPL,BSD,MIT,Apache)
- android--计时器(Timer)
- JAVA中Random类的Random r=new Random()和Random r=new Random(seedValue)的区别
- android dialog left_icon
- (Java)利用ListIterator(iterator 重复器/迭代器的子接口) 操作ArrayList
- ZOJ 2478
- mac环境下Rwordseg和rJava的安装
- Line 20: EntityRef: expecting ';' 鄙人遇到的问题解决方案
- java垃圾回收
- Marshal.StructureToPtr(Object, IntPtr, Boolean)[将数据从托管对象封送到非托管内存块]
- [微软]题目4 : Image Encryption
- C/C++编程中容易忽略的知识
- ios 里 对 sqlite数据库进行操作的最底层C函数说明 - xcode里查不到 --特么是C++的 @-@
- ajax
- JavaScript中简单的数组使用及明细处理
- ubuntu下的所有解压文件命令
- 用OpenCV进行人脸检测遇到的无法显示人像的问题