在您的遊戲或應用程式中使用 3D 素材
本文說明如何使用 Visual Studio 來處理 3D 資產,並將其包含在您的組建中。
使用 Visual Studio 中的工具建立 3D 資產之後,下一個步驟是在應用程式中使用它們。 但是,您必須先將資產轉換成 DirectX 可以理解的格式,才能使用這些資產。 為了協助您轉換資產,Visual Studio 會針對它可以產生的每一種資產提供組建自定義。 若要在組建中包含資產,您只需要將項目設定為使用組建自定義、將資產新增至專案,以及設定資產以使用正確的組建自定義。 之後,您可以將資產載入您的應用程式,並藉由建立和填入 DirectX 資源,就像您在任何其他 DirectX 應用程式中一樣使用它們。
設定您的專案
在您可以將 3D 資產部署為組建的一部分之前,Visual Studio 必須知道您想要部署的資產類型。 Visual Studio 已經知道許多常見的檔類型,但由於只有某些類型的應用程式使用 3D 資產,Visual Studio 不會假設專案會建置這類檔案。 您可以告訴 Visual Studio 您的應用程式使用這類資產,方法是使用 建置自定義-- 檔案,告知 Visual Studio 如何以有用的方式處理不同類型的檔案,這些檔案是針對每個資產類型所提供的。 由於這些自定義設定是以每個項目為基礎套用,您只需要將適當的自定義設定新增至專案。
將組建自定義新增至您的專案
在 [方案總管]中,開啟專案的快顯功能表,然後選擇 [建置相依性]>[建置自訂]。
在 [Visual C++ 建置自訂檔案] 對話框隨即出現。
在 [可用的組建自定義檔案底下,選取對應至您要在專案中使用之資產類型的複選框,如下表所述:
資產類型 建置自定義名稱 紋理和影像 ImageContentTask(.targets, .props) 3D 模型 MeshContentTask(.targets, .props) 著色器 ShaderGraphContentTask(.targets, .props) 注意
由於 Autodesk FBX SDK 中的安全性考慮,Visual Studio 2022 17.9.3 已移除模型編輯器和 MeshContentTask 的支援。 請參閱 CVE-2023-27911。
選擇 [確定] 按鈕。
在組建中包含資產
既然您的專案知道您想要使用的不同 3D 資產類型,下一個步驟是告訴它哪些檔案是 3D 資產,以及它們有哪些資產類型。
將資產新增至您的專案
在 方案總管中,在您的專案中開啟資產的捷徑鍵功能表,然後選擇 [屬性] 。
資產 屬性頁 對話框隨即出現。
請確保 組態 和 平台 屬性都已設置為您想要進行變更時所希望的值。
在 [組態屬性]下,選擇 [一般 ],然後在屬性方格的 [一般 ]下,將 [項目類型] 屬性設定為適當的內容管線項目類型。 例如,針對影像或紋理檔案,選擇 影像內容管線。
重要
根據預設,Visual Studio 會假設應該使用 Visual Studio 內建的 Image 項目類型來分類許多種類的圖像檔。 因此,您必須變更影像內容管線所要處理之每個影像的 項目類型 屬性。 3D 模型和視覺著色器圖形的其他類型的內容管線來源檔案預設為正確的 項目類型。
選擇 [確定] 按鈕。
以下是三個內容管線項目類型及其相關聯的來源和輸出文件類型。
項目類型 | 來源檔案類型 | 輸出檔案格式 |
---|---|---|
影像內容管線 | 可攜式網路圖形 (.png) JPEG (.jpg,.jpeg,.jpe,.jfif) 直接繪製表面(Direct Draw Surface)(.dds) 圖形交換格式 (.gif) 點陣圖 (.bmp, .dib) 標記的影像檔案格式 (.tif, .tiff) 塔加 (.tga) |
DirectDraw Surface「.dds」 |
Mesh 內容管線 | Autodesk FBX 交換檔案 (.fbx) Collada DAE 檔案 (.dae) Wavefront OBJ 檔案 (.obj) |
3D 網格檔案 (.cmo) |
著色器內容管線 | 視覺著色器圖形 (.dgsl) | 編譯的著色器輸出 (.cso) |
設定資產內容管線屬性
您可以設定每個資產檔案的內容管線屬性,使其以特定方式建置。
設定內容管道屬性
在 [方案總管]中,於資產檔案上開啟快捷功能表,然後選擇 [屬性]。
資產 屬性頁 對話框隨即出現。
請確定 組態 和 平台 屬性已設定為您想要套用變更的值。
在 [組態屬性]下,選擇內容管線節點(例如,紋理和影像資產的影像內容管線),然後在屬性方格中,將屬性設定為適當的值。 例如,若要在建置時產生紋理資產的Mipmap,請將 [產生Mips] 屬性設定為[是] 。
選擇 [確定] 按鈕。
影像內容管線設定
當您使用影像內容管線工具來建置紋理資產時,您可以透過各種方式壓縮紋理、指出是否應該在建置階段產生 MIP 層級,以及變更輸出檔的名稱。
財產 | 描述 |
---|---|
壓縮 | 指定用於輸出檔案的壓縮類型。 可用的選項如下: - 沒有壓縮 - BC1_UNORM 壓縮 - BC1_UNORM_SRGB 壓縮 - BC2_UNORM 壓縮 - BC2_UNORM_SRGB 壓縮 - BC3_UNORM 壓縮 - BC3_UNORM_SRGB 壓縮 - BC4_UNORM 壓縮 - BC4_SNORM 壓縮 - BC5_UNORM 壓縮 - BC5_SNORM 壓縮 - BC6H_UF16 壓縮 - BC6H_SF16 壓縮 - BC7_UNORM 壓縮 - BC7_UNORM_SRGB 壓縮 如需不同 DirectX 版本中支援哪些壓縮格式的詳細資訊,請參閱 DXGI 程式設計指南。 |
轉換為預先乘法格式 | 是 將影像轉換為輸出檔中的預先乘法 alpha 格式;否則,否。 只有輸出檔案已變更,來源影像不會變更。 |
產生Mips | 是 在建置時產生完整的 MIP 鏈結,並將其包含在輸出檔案中;否則,否。 如果 沒有,而且來源檔案已經包含mipmap鏈結,則輸出檔案會有 MIP 鏈結;否則,輸出檔案將不會有任何 MIP 鏈結。 |
內容輸出 | 指定輸出檔的名稱。 重要事項: 變更輸出檔的擴展名不會影響其檔格式。 |
網格內容流水線配置
當您使用網格內容管線工具來建置網格資產時,您可以變更輸出檔的名稱。
財產 | 描述 |
---|---|
內容輸出 | 指定輸出檔的名稱。 重要事項: 變更輸出檔的擴展名不會影響其檔格式。 |
著色器內容數據流設定
當您使用著色器內容管線工具來建置著色器資產時,您可以變更輸出檔的名稱。
財產 | 描述 |
---|---|
內容輸出 | 指定輸出檔的名稱。 重要事項: 變更輸出檔的擴展名不會影響其檔格式。 |
在執行時載入和使用 3D 資產
使用紋理和影像
Direct3D 提供用來建立紋理資源的函式。 在 Direct3D 11 中,D3DX11 公用程式連結庫會提供額外的功能,讓您直接從圖像檔建立紋理資源和資源檢視。 如需如何在 Direct3D 11 中建立紋理資源的詳細資訊,請參閱 紋理。 如需如何使用 D3DX11 連結庫從圖像檔建立紋理資源或資源檢視的詳細資訊,請參閱 如何:從檔案初始化紋理。
使用 3D 模型
Direct3D 11 不提供從 3D 模型建立資源的函式。 相反地,您必須撰寫程式代碼來讀取 3D 模型檔案,並建立頂點和索引緩衝區,代表 3D 模型以及模型所需的任何資源,例如紋理或著色器。
使用著色器
Direct3D 提供函式來建立著色器資源,並將其系結至可程式化圖形管線。 如需如何在 Direct3D 中建立著色器資源並將其系結至管線的詳細資訊,請參閱 HLSL 程式設計指南。
在可程式化圖形管線中,管線的每個階段都必須將結果格式化為下一個階段可以理解的方式。 因為著色器設計工具只能建立像素著色器,這意味著確保接收到的數據符合預期格式是您的應用程式的責任。 圖元著色器之前有數個可程式化的著色器階段,這些階段執行幾何轉換,包括頂點著色器、外殼著色器、面域著色器和幾何著色器。 非程式化的鑲嵌階段也會在像素著色器之前發生。 無論上述階段中哪一個直接在圖元著色器之前執行,都必須以以下格式提供結果:
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;
};
相關主題
標題 | 描述 |
---|---|
如何:匯出包含 mipmap 的紋理 | 描述如何使用影像內容管線匯出包含預先計算Mipmap的紋理。 |
如何:匯出具有預乘 Alpha 的紋理 | 描述如何使用影像內容管線匯出包含預乘 Alpha 值的紋理。 |
如何匯出紋理以搭配 Direct2D 或 JavaScript 應用程式使用 | 描述如何使用影像內容管線匯出可在 Direct2D 或 JavaScript 應用程式中使用的紋理。 |
運用於遊戲和應用程式的 3D 資產 | 描述 Visual Studio 為建立和操作 3D 資產提供的編輯工具,其中包括紋理和影像、3D 模型和著色器。 |
如何匯出著色器 | 描述如何從著色器設計工具導出著色器。 |