博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectX11 顶点着色器阶段
阅读量:4087 次
发布时间:2019-05-25

本文共 1663 字,大约阅读时间需要 5 分钟。

顶点着色器阶段

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
(mClientWidth)/mClientHeight;}

转载地址:http://giyii.baihongyu.com/

你可能感兴趣的文章
学习C++需要注意的问题
查看>>
C++模板
查看>>
C++双冒号(::)的用法
查看>>
【Unity】封装SQLite管理类
查看>>
【Unity】面试题整理
查看>>
【C#】如何实现一个迭代器
查看>>
【Unity】Destroy和DestroyImmediate的区别
查看>>
【Lua】Mac系统下配置SublimeText的Lua编译环境
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
【Unity】微信登录后将头像存为bytes,将bytes读取成sprite图片
查看>>
【Unity】使用GPS定位经纬度
查看>>
【UGUI/NGUI】一键换Text/Label字体
查看>>
【C#】身份证本地验证
查看>>
【Unity】坑爹的Bug
查看>>
【算法】求数组中某两个数的和为目标值
查看>>
如何高效学习动态规划?
查看>>
动态规划法(六)鸡蛋掉落问题(一)
查看>>
LeetCode 887.鸡蛋掉落(C++)
查看>>
Dijkstra‘s algorithm (C++)
查看>>
奇异值分解(SVD)的原理详解及推导
查看>>