Win10系列:VC++ Direct3D模板介绍1
Visual Studio為開發Direct3D應用程序提供了便捷的模版,讀者可以不必手動去新建Direct3D中所使用到的基礎資源,而只需專注于圖形的繪制。本小節主要為讀者介紹這個模版中用于繪制圖形的主要函數及其功能,為了能讓讀者更為清楚地了解如何使用此模版繪制三維立體圖形,下面的介紹將分為四部分,其中第一部分介紹在Visual Staudio 2012中如何新建Direct3D項目模版,第二部分介紹Direct3D項目模版中用于設置觀察視點的函數和設置投影矩陣的函數,第三部分緊接著來介紹Direct3D項目模版中用于創建著色器和立體圖形頂點的函數,最后一部分介紹Direct3D項目模版中用于繪制立體圖形的函數。
(1)新建Direct3D項目模版
打開Visual Studio,單擊"文件"菜單,在出現的下拉菜單欄中選擇"新建項目",彈出"新建項目"窗口,并選擇"Visual C++"菜單欄的"Windows應用商店"選項,接著選中"Direct3D應用程序",如圖20-22所示。
圖20-22 添加Direct3D項目模版
通過上述的步驟可以新建一個Direct3D應用程序項目作為開發Direct3D應用程序的模版,在這個項目中主要包含如下的文件:
- BasicTimer.h頭文件,在這個頭文件中定義了一個作為計時器的BasicTimer類。
- DirectXHelper.h頭文件,在這個頭文件中定義了用于處理異常和讀取資源文件的函數。
- CubeRenderer.h頭文件,用于聲明在CubeRenderer.cpp源文件中所使用的變量和函數。
- Direct3Dbase.h頭文件,用于聲明在Direct3DBase.cpp源文件中所使用的變量和函數。
- CubeRenderer.cpp源文件,在這個源文件中添加用于繪制立體圖形的實現代碼。
- Direct3DBase.cpp源文件,在這個源文件中添加用于新建Direct3D資源的實現代碼。
- SimplePixelShader.hlsl文件,用于解析像素著色器的信息。
- SimpleVertexShader.hlsl文件,用于解析頂點著色器的信息。
了解了如何在Visual Staudio 2012中新建一個用于開發Direct3D應用程序的模版以后,下面將介紹此模版中用于設置觀察視點的函數和設置投影矩陣的函數。
(2)Update函數和CreateWindowSizeDependentResources函數
在介紹Update函數和CreateWindowSizeDependentResources函數之前,首先來介紹ModelViewProjectionConstantBuffer結構體,此結構體默認定義在CubeRenderer.h頭文件中,代碼如下所示:
struct ModelViewProjectionConstantBuffer
{
????DirectX::XMFLOAT4X4 model;
????DirectX::XMFLOAT4X4 view;
????DirectX::XMFLOAT4X4 projection;
};
在ModelViewProjectionConstantBuffer結構體中定義了三個XMFLOAT4X4結構體的變量,分別是model、view和projection。其中model結構體變量用于表示立體圖形的世界矩陣,view結構體變量用于表示立體圖形的觀察矩陣,projection結構體變量用于表示立體圖形的投影矩陣。
CubeRenderer.cpp源文件的Update函數用于設置觀察視點,此觀察視點用來將三維立體圖形呈現在應用窗口中。Update函數的實現代碼如下所示:
void CubeRenderer::Update(float timeTotal, float timeDelta)
{
????// 未使用的參數
????(void) timeDelta;
????//觀察視點的位置,X=0.0,Y=0.7,Z=1.5,W=0.0
????XMVECTOR eye = XMVectorSet(0.0f, 0.7f, 1.5f, 0.0f);
????//觀察目標的位置,X=0.0,Y=-0.1,Z=0.0,W=0.0
????XMVECTOR at = XMVectorSet(0.0f, -0.1f, 0.0f, 0.0f);
????//觀察視點的向上向量,X=0.0,Y=1.0,Z=0.0,W=0.0
????XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
????//設置觀察視點
????XMStoreFloat4x4(&m_constantBufferData.view, XMMatrixTranspose(XMMatrixLookAtRH(eye, at, up)));
????//設置世界矩陣
????XMStoreFloat4x4(&m_constantBufferData.model, XMMatrixTranspose(XMMatrixRotationY(timeTotal * XM_PIDIV4)));
}
在上面的代碼中定義了三個XMVECTOR類型的變量eye、at和up,其中eye變量用于儲存觀察視點的位置,at變量用于儲存觀察目標的位置,up變量用于儲存觀察視點的向上向量。調用XMVectorSet函數將觀察視點的位置設為{0.0f,0.7f,1.5f,0.0f },并將觀察目標的位置設為{0.0f,-1.0f,0.0f,0.0f },接著將觀察視點的向上向量設為{0.0f,1.0f,0.0f,0.0f}。接下來調用XMMatrixLookAtRH函數并使用eye變量、at變量和up變量作為參數得到一個矩陣,并以這個矩陣作為參數調用XMMatrixTranspose函數得到一個轉置矩陣,接著調用XMStoreFloat4x4函數將此轉置矩陣存儲到view結構體變量中。
然后以參數timeTotal乘以XM_PIDIV4常量所得到的值作為參數調用XMMatrixRotationY 函數,得到一個繞Y軸的旋轉矩陣,并以這個旋轉矩陣作為參數調用XMMatrixTranspose函數得到一個轉置矩陣,最后調用XMStoreFloat4x4函數將這個轉置矩陣存儲到model結構體變量中,使立體圖形繞Y軸旋轉。
CubeRenderer.cpp源文件的CreateWindowSizeDependentResources函數用于設置投影矩陣,此函數的實現代碼如下所示:
void CubeRenderer::CreateWindowSizeDependentResources()
{
????Direct3DBase::CreateWindowSizeDependentResources();
????//定義aspectRatio變量
????float aspectRatio = m_windowBounds.Width / m_windowBounds.Height;
????//定義fovAngleY變量
????float fovAngleY = 70.0f * XM_PI / 180.0f;
????//設置投影矩陣
????XMStoreFloat4x4(
????????&m_constantBufferData.projection,
????????XMMatrixTranspose(
????????????XMMatrixMultiply(
????????????????XMMatrixPerspectiveFovRH(fovAngleY,
????????????????????aspectRatio,
????????????????????0.01f,
????????????????????100.0f
????????????????),
????XMLoadFloat4x4(&m_orientationTransform3D)
????????????)
????????)
????);
}
在上面的代碼中,首先調用定義在Direct3DBase.cpp源文件中的CreateWindowSizeDependentResources函數來新建與應用窗口大小相關的資源。然后定義兩個float類型的變量aspectRatio和fovAngleY,將應用窗口的寬度除以應用窗口的高度所得到的值賦給aspectRatio變量,并將70.0f乘以XM_PI常量再除以180.0f所得到的值賦給fovAngleY變量。接著以aspectRatio變量和fovAngleY變量作為參數調用XMMatrixPerspectiveFovRH函數來得到一個右手透視投影矩陣,使用XMMatrixMultiply函數將這個左手透視矩陣乘以XMLoadFloat4x4函數所返回的矩陣,得到一個新矩陣,并以這個新矩陣作為參數調用XMMatrixTranspose函數得到一個轉置矩陣,最后調用XMStoreFloat4x4函數將這個轉置矩陣存儲到projection結構體變量中。
總結
以上是生活随笔為你收集整理的Win10系列:VC++ Direct3D模板介绍1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库设计-基础-1-教务科研申报系统设
- 下一篇: context:annotation-c