您的位置:首页 > 其它

DirectX11 顶点着色器阶段

2015-09-29 21:28 405 查看
顶点着色器阶段

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: