D3D11无双(2):渲染一个3D彩色立方体

渲染一个彩色立方体,这是个很经典的案例,上一篇文章成功地渲染了一个三角形,这次是个3D对象。

(注:blog: http://blog.csdn.net/booirror)

3D空间

对象空间:对象空间也叫模型空间,是美工创建模型是使用的坐标。通常位于模型的中间。

世界空间:是将场景中的所有对象共享于一个坐标下。

相机空间:也用于整个场景,但原点位于相机处。

投影空间:相机空间应用投影变换后的空间,x,y的范围是-1,1。z的范围是0到1。

屏幕空间:涉及到帧缓冲,是2d纹理,所以屏幕空间是2d空间,左上角为原点,x轴向右,y轴向下。


空间变换

视图变换:XMMatrixLookAtLH将返回视图变换矩阵

投影变换:XMMatrixPerspectiveFovLH将返回投影变换矩阵


平截头体

由远近平面,相机水平垂直可视夹角构成的平截头体,平截头越宽,可见对象越多。GPU会过滤掉平截头体之外的对象,以加速渲染速度,这个过程叫裁剪。


创建顶点缓冲,索引缓冲,输入布局等跟上一篇类似,不再赘述。这里重点说明相机参数设置。首先需要确定相机可视范围,近平面,和远平面,并告诉屏幕宽高比,得到投影变换矩阵:

XMMATRIX p = XMMatrixPerspectiveFovLH(MathHelper::Pi/3.0, AspectRatio(), 1.0f, 1000.0f);


我们需要设置相机的位置,聚焦点,朝向,并返回视图变换矩阵:

XMMATRIX V = XMMatrixLookAtLH(pos, target, up);


绘制场景代码如下:

void BoxApp::DrawScene()

{
md3dImmediateContext->ClearRenderTargetView(mRenderTargetView,
reinterpret_cast<const float*>(&Colors::Blue));
md3dImmediateContext->ClearDepthStencilView(mDepthStencilView,
D3D11_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0);

md3dImmediateContext->IASetInputLayout(mInputLayout);
md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
UINT stride = sizeof(Vertex);
UINT offset = 0;
md3dImmediateContext->IASetVertexBuffers(0, 1, &mBoxVB, &stride, &offset);
md3dImmediateContext->IASetIndexBuffer(mBoxIB, DXGI_FORMAT_R32_UINT, 0);

XMMATRIX world = XMLoadFloat4x4(&mWorld);
XMMATRIX view = XMLoadFloat4x4(&mView);
XMMATRIX proj = XMLoadFloat4x4(&mProj);
XMMATRIX worldViewProj = world* view* proj;
mfxWorldViewProj->SetMatrix(reinterpret_cast<float*>(&worldViewProj));

D3DX11_TECHNIQUE_DESC techDesc;
mTech->GetDesc(&techDesc);
for (UINT p = 0; p < techDesc.Passes; ++p) {
mTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
md3dImmediateContext->DrawIndexed(36, 0, 0);
}
HR(mSwapChain->Present(0, 0));
}

效果:


你可能感兴趣的:(C++,3D,d3,DirectX,directx11)