IA阶段主要读取初始数据从用户填充的buffer里面并且组装成图元用于下一个管线阶段。IA主要用到三个函数:
void IASetIndexBuffer(
[in, optional] ID3D11Buffer *pIndexBuffer,
[in] DXGI_FORMAT Format,
[in] UINT Offset
);
void IAGetVertexBuffers(
[in] UINT StartSlot,
[in] UINT NumBuffers,
[out, optional] ID3D11Buffer **ppVertexBuffers,
[out, optional] UINT *pStrides,
[out, optional] UINT *pOffsets
);
void IASetPrimitiveTopology(
[in] D3D11_PRIMITIVE_TOPOLOGY Topology
);
void IASetInputLayout(
[in, optional] ID3D11InputLayout *pInputLayout
);
上面四个函数作为IA阶段。
这里主要讲解下
//--------------------------------------------------------------------------------------
struct VS_INPUT
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
};
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
};
//--------------------------------------------------------------------------------------
// Vertex Shader
//--------------------------------------------------------------------------------------
PS_INPUT VS(VS_INPUT input)
{
PS_INPUT output = (PS_INPUT)0;
output.Pos = mul(input.Pos, World);
output.Pos = mul(output.Pos, View);
output.Pos = mul(output.Pos, Projection);
output.Tex = input.Tex;
return output;
}
当IA阶段绑定到管线阶段的Vertex Buffer是所有的顶点数据,并且告诉管线每一顶点数据Stride。
视图矩阵的创建。
// Initialize the view matrix
XMVECTOR Eye = XMVectorSet(0.0f, 3.0f, -6.0f, 0.0f);
XMVECTOR At = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
XMVECTOR Up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
g_View = XMMatrixLookAtLH(Eye, At, Up);
这里就直接用XMMatrixLookAtLH函数创建一个视图矩阵,在DirectX11有分左手与右手,但是在这里我们将只关注左手坐标系。而XMMatrixLookAtLH函数原型如下:
XMMATRIX XMMatrixLookAtLH(
[in] XMVECTOR EyePosition,
[in] XMVECTOR FocusPosition,
[in] XMVECTOR UpDirection
);
现在我将推到这个矩阵是怎么成立的,首先
下面我讲透视矩阵,在透视矩阵我们用XMMatrixPerspectiveFovLH能轻易创建一个视图矩阵,函数原型是:
XMMATRIX XMMatrixPerspectiveFovLH(
[in] float FovAngleY,
[in] float AspectRatio,
[in] float NearZ,
[in] float FarZ
);
那是透视矩阵式怎样推到出来的呢。
假设在View Frustum中任意点P(x,y,z,1)投影到Front Cliping Plane是P’(x’,y’,z’,w);这里开始齐次坐标,前面没有讲齐次坐标,所以要简单讲解下。简单的来说就是为了把方向与位置区分,当用三个量表示方向与位置的时候很难区分,所以呢。
为了简化问题,我们考虑YOZ平面上的投影情况,见下图。设P(x, y, z)是Frustum内一点,它在近剪裁平面上的投影是P’(x’, y’, z’)。
这里要简单讲解下线性映射,加入x在[left, right]这条线段上的位置,而[-1, 1]上对应的x’的值是多少呢?就是这么回事
根据三角形相似等比:
那么得出后的
这里有一个重要的提示,投影后的z值就不见了,而x,y都到Front Clipping Plane,当然第三点信息都是N,那么这点信息就会都没有呢所以就会把这点写成
为什么要写成这样的,有时间再添
现在要把第三点要求导CVV里面,而D3D里面近裁剪面为0,而原裁剪面是1,