DirectX11 顶点着色器阶段

顶点着色器阶段
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值