在遊戲或應用程式中使用 3D 資產
本文說明如何使用 Visual Studio 處理 3D 資產及在組建中納入 3D 資產。
使用 Visual Studio 中的工具建立 3D 資產之後,下一個步驟就是在應用程式中使用這些資產。 但是在使用之前,您的資產必須轉換成 DirectX 可以了解的格式。 為協助您轉換資產,Visual Studio 提供可產生之每種資產的組建自訂功能。 要在組建中包含資產,您只需要設定專案使用組建自訂、將資產加入到專案中,然後設定資產使用正確的組建自訂即可。 在那之後,您可以建立並填入 DirectX 資源,就如同在其他 DirectX 應用程式一樣,將資產載入至應用程式並加以運用。
設定專案
Visual Studio 必須先知道您想要部署之資產的類型,然後您才能將 3D 資產當做組建的一部分進行部署。 Visual Studio 已經知道許多常見檔案類型,不過,由於只有某些種類的應用程式使用 3-D 資產,因此 Visual Studio 不假設專案會建置這些類型的檔案。 您可以使用每個資產類型提供的組建自訂讓 Visual Studio 知道您的應用程式使用這類資產,該檔案可指定 Visual Studio 如何有效處理不同類型的檔案。 由於這些自訂會套用在每一個專案,因此只需要將適當的自訂加入至您的專案即可。
若要將組建自訂加入至您的專案中
在 [方案總管] 中,開啟專案的捷徑功能表,然後選擇 [組建自訂]。 [Visual C++ 建置自訂檔案] 對話方塊隨即顯示。
您只要將這些組建自訂加入到 Visual Studio 中一次即可;如果您已經加入這些組建自訂,就可以跳過這個步驟。
選擇 [尋找現有的] 按鈕,然後巡覽至 Visual Studio 安裝目錄\Common7\IDE\Extensions\Microsoft\VSGraphics\,其中包含三個支援 3D 資產建置的組建自訂。 選取其中一個建置自訂檔案 (例如,ImageContentTask.targets),然後選擇 [開啟] 按鈕。 出現詢問您是否要將目錄加入至組建自訂搜尋路徑的訊息時,選取 [是] 按鈕。 這樣可以完全開放使用三個組建自訂。
選擇 [重新整理清單] 按鈕以重新整理 [可用的組建自訂檔] 資料格檢視控制項。
在 [可用的組建自訂檔] 資料格檢視控制項中,選取對應於您想要在專案中使用的資產類型的核取方塊,如下表所述:
資產類型
組建自訂名稱
紋理和影像
ImageContentTask (.targets、.props)
3D 模型
MeshContentTask (.targets、.props)
著色器
ShaderGraphContentTask(.targets, .props)
選擇 [確定] 按鈕。
將資產包含在您的組建中
現在專案知道您要使用的不同類型 3D 資產,下一步就是告訴它哪些檔案是 3D 資產及其資產類型為何。
在組建中加入資產
在 [方案總管] 中,在您的專案裡,按一下資產的捷徑功能表,然後選擇 [屬性]。 資產的 [屬性頁] 對話方塊隨即顯示。
確定將 [組態] 和 [平台] 屬性設定為您想要變更會套用到的值。
在 [組態屬性] 底下,選擇 [一般],然後在屬性方格中的 [一般] 下,將 [項目型別] 屬性設為適當的內容管線項目類型。 例如,若為影像或材質檔案,請選擇 [影像內容管線]。
重要
根據預設,Visual Studio 假設應該使用 Visual Studio 內建的 [影像] 項目類型來分類各種影像檔。因此,您必須變更要由影像內容管線處理之每個影像的 [項目型別] 屬性。其他立體模型及視覺化著色器圖形之內容管線原始程式檔的類型會預設為正確的 [項目類型]。
選擇 [確定] 按鈕。
以下是三個內容管線項目類型及其關聯來源和輸出檔案類型。
項目類型 |
資源檔類型 |
輸出檔格式 |
---|---|---|
影像內容管線 |
可攜式網路圖形 (*.png) JPEG (.jpg、.jpeg、.jpe、.jfif) Direct Draw 介面 (.dds) 圖形交換格式 (.gif) 點陣圖檔 (.bmp、.dib) 標記的影像檔案格式 (.tif 或 .tiff) Targa (.tga) |
DirectDraw 介面 (.dds) |
網狀內容管線 |
AutoDesk FBX 交換檔案 (.fbx) Collada DAE 檔 (.dae) Wavefront OBJ 檔案 (.obj) |
立體網狀結構檔案 (.cmo) |
著色器內容管線 |
視覺著色器圖形 (.dgsl) |
編譯過的著色器輸出 (.cso) |
設定資產內容管線屬性
您可以為每個資產檔案設定內容管線屬性,以特定方式建置該檔案。
擷取內容管線屬性
在 [方案總管] 中的專案裡,開啟資產檔案的捷徑功能表,然後選擇 [屬性]。 資產的 [屬性頁] 對話方塊隨即顯示。
確定將 [組態] 和 [平台] 屬性設定為您想要變更會套用到的值。
在 [組態屬性] 下,選擇內容管線節點。例如代表材質和影像資產的 [影像內容管線],然後在屬性方格中,將屬性設為適當的值。 例如,若要在建置時間產生材質資產的 MIP 對應,請將 [產生 Mips] 屬性設定為 [是]。
選擇 [確定] 按鈕。
影像內容管線組態
當您使用影像內容管線工具建置材質資產時,可以以多種方式壓縮材質,指定是否應在建置階段產生 MIP 層級,並且變更輸出檔案的名稱。
屬性 |
描述 |
---|---|
壓縮 |
指定輸出檔的壓縮類型。 可用的選項有:
如需 DirectX 不同版本支援之壓縮格式的詳細資訊,請參閱 DXGI 的程式設計指南。 |
產生 Mips |
[是] 可在組建階段產生完整的 MIP 鏈結,並將此鏈結包含在輸出檔中;否則請選擇 [否]。 如果為 [否],而且原始程式檔已經包含 MIP 對應鏈結,則輸出檔會有 MIP 鏈結,否則輸出檔沒有 MIP 鏈結。 |
內容輸出 |
指定輸出檔名稱。
重要事項
變更輸出檔的副檔名對其檔案格式沒有影響。
|
網狀內容管線組態
當您使用網狀內容管線工具建置網狀資產時,可以變更輸出檔的名稱。
屬性 |
描述 |
---|---|
內容輸出 |
指定輸出檔名稱。
重要事項
變更輸出檔的副檔名對其檔案格式沒有影響。
|
著色器內容管線組態
當您使用著色器內容管線工具建置著色器資產時,可以變更輸出檔的名稱。
屬性 |
描述 |
---|---|
內容輸出 |
指定輸出檔名稱。
重要事項
變更輸出檔的副檔名對其檔案格式沒有影響。
|
在執行階段載入和使用 3D 資產
使用材質和影像
Direct3D 會提供建立材質資源的函式。 在 Direct3D 11 中,D3DX11 公用程式程式庫會提供可直接從影像檔建立材質資源和資源檢視的額外函式。 如需如何在 Direct3D 11 中建立材質資源的詳細資訊,請參閱材質。 如需如何使用 D3DX11 程式庫的詳細資訊建立材質資源或資源檢視從影像檔,請 HOW TO:初始化紋理從檔案參閱。
使用 3-D 模型
Direct3D 11 不提供從立體模型建立資源的函式。 相反地,您必須撰寫讀取立體模型檔案的程式碼,並建立表示立體模型及模型所需之任何資源 (例如材質和著色器) 的頂點及索引緩衝區
使用著色器
為 Direct3D 建立著色器資源和繫結提供函式讓可程式化的圖形管線。 如需如何在 Direct3D 的著色器資源並將它繫結的詳細資訊至管線,請 HLSL 的程序指南參閱。
在可程式化的圖形管線中,管線的每個階段都必須為管線的下一個階段提供格式化為其可了解的結果。 由於 Shader 設計工具只能建立一個像素著色器 (Pixel Shader),這表示確保應用程式收到的資料是預期的格式取決於應用程式本身。 有數個可程式化著色器階段 (頂點著色、輪廓著色器、網域著色器和幾何著色器) 在像素著色器之前發生,並執行幾何轉換。 非可程式化的鑲嵌階段也在像素著色器之前先發生。 無論這其中哪個階段直接在像素著色器之前,都必須以這個格式提供其結果:
struct PixelShaderInput
{
float4 pos : SV_POSITION;
float4 diffuse : COLOR;
float2 uv : TEXCOORD0;
float3 worldNorm : TEXCOORD1;
float3 worldPos : TEXCOORD2;
float3 toEye : TEXCOORD3;
float4 tangent : TEXCOORD4;
float3 normal : TEXCOORD5;
};
根據您在著色器中所使用的[著色器設計工具] 節點,您可能還需要根據這些定義提供格式的其他資料:
Texture2D Texture1 : register( t0 );
Texture2D Texture2 : register( t1 );
Texture2D Texture3 : register( t2 );
Texture2D Texture4 : register( t3 );
Texture2D Texture5 : register( t4 );
Texture2D Texture6 : register( t5 );
Texture2D Texture7 : register( t6 );
Texture2D Texture8 : register( t7 );
TextureCube CubeTexture1 : register( t8 );
TextureCube CubeTexture2 : register( t9 );
TextureCube CubeTexture3 : register( t10 );
TextureCube CubeTexture4 : register( t11 );
TextureCube CubeTexture5 : register( t12 );
TextureCube CubeTexture6 : register( t13 );
TextureCube CubeTexture7 : register( t14 );
TextureCube CubeTexture8 : register( t15 );
SamplerState TexSampler : register( s0 );
cbuffer MaterialVars : register (b0)
{
float4 MaterialAmbient;
float4 MaterialDiffuse;
float4 MaterialSpecular;
float4 MaterialEmissive;
float MaterialSpecularPower;
};
cbuffer LightVars : register (b1)
{
float4 AmbientLight;
float4 LightColor[4];
float4 LightAttenuation[4];
float3 LightDirection[4];
float LightSpecularIntensity[4];
uint IsPointLight[4];
uint ActiveLights;
}
cbuffer ObjectVars : register(b2)
{
float4x4 LocalToWorld4x4;
float4x4 LocalToProjected4x4;
float4x4 WorldToLocal4x4;
float4x4 WorldToView4x4;
float4x4 UVTransform4x4;
float3 EyePosition;
};
cbuffer MiscVars : register(b3)
{
float ViewportWidth;
float ViewportHeight;
float Time;
};