DirectX11入门篇

开始学些DirectX11,跟着流水线走。
DirectX11入门篇_第1张图片

IA阶段

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阶段。
这里主要讲解下

定点shader

//--------------------------------------------------------------------------------------
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
);

现在我将推到这个矩阵是怎么成立的,首先
DirectX11入门篇_第2张图片
下面我讲透视矩阵,在透视矩阵我们用XMMatrixPerspectiveFovLH能轻易创建一个视图矩阵,函数原型是:


XMMATRIX XMMatrixPerspectiveFovLH(
  [in] float FovAngleY,
  [in] float AspectRatio,
  [in] float NearZ,
  [in] float FarZ
);

那是透视矩阵式怎样推到出来的呢。
DirectX11入门篇_第3张图片
假设在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’)。
DirectX11入门篇_第4张图片
这里要简单讲解下线性映射,加入x在[left, right]这条线段上的位置,而[-1, 1]上对应的x’的值是多少呢?就是这么回事
DirectX11入门篇_第5张图片
DirectX11入门篇_第6张图片
根据三角形相似等比:
这里写图片描述
那么得出后的
这里写图片描述
这里有一个重要的提示,投影后的z值就不见了,而x,y都到Front Clipping Plane,当然第三点信息都是N,那么这点信息就会都没有呢所以就会把这点写成
这里写图片描述
为什么要写成这样的,有时间再添
现在要把第三点要求导CVV里面,而D3D里面近裁剪面为0,而原裁剪面是1,
这里写图片描述

Hull Shader

你可能感兴趣的:(图形学)