继续按照MS的官方教程来整理知识点。上一篇我们从理论层面讲了顶点变换,这一篇我们将把理论用于实践。DX11中对顶点的变换操作同样是在顶点着色器中进行,所以除了顶点信息之外,我们需要把变换矩阵也添入着色器输入的队伍中去。
初始化变换矩阵
为了方便操作,我们将三个变换矩阵都放在一个结构体中,这个结构体将作为常量缓存输入着色器。
struct ConstantBuffer
{
XMMATRIX mWorld;
XMMATRIX mView;
XMMATRIX mProjection;
};
全局变量新增:
ID3D11Buffer* g_pConstantBuffer = NULL;
XMMATRIX g_World;
XMMATRIX g_View;
XMMATRIX g_Projection;
InitDevice()新增:
// Create the constant buffer
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(ConstantBuffer);
//绑定信息是常量缓存
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
//先传NULL数据进去,render时再更新g_pConstantBuffer
hr = g_pd3dDevice->CreateBuffer( &bd, NULL, &g_pConstantBuffer );
if( FAILED( hr ) )
return hr;
//初始化各个矩阵
//设置模型矩阵,以标准矩阵初始化
// Initialize the world matrix
g_World = XMMatrixIdentity();
//设置视图矩阵,初始化照相机位置和朝向
// Initialize the view matrix
XMVECTOR Eye = XMVectorSet( 0.0f, 1.0f, -5.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 );
//设置透视投影矩阵,XM_PIDIV2=1.57,是y方向上视野角的弧度值;width和height是窗口客户区的宽高
// Initialize the projection matrix
g_Projection = XMMatrixPerspectiveFovLH( XM_PIDIV2, width / (FLOAT)height, 0.01f, 100.0f );
渲染时输入变换矩阵的实际值
在Render()时,我们将更新g_pConstantBuffer的填充数据
ConstantBuffer cb;
cb.mWorld = XMMatrixTranspose( g_World );
cb.