ここでは、Visual Studio を使用して 3-D アセットを処理し、ビルドに含める方法について説明します。
Visual Studio のツールを使用して 3-D アセットを作成したら、次の手順はアプリケーションでそれらを使用することです。ただし、これらを使用する前に、DirectX が理解できる形式にアセットを変換する必要があります。アセットを変換しやすいように、Visual Studio には、生成できるアセットの種類ごとにビルドのカスタマイズが用意されています。アセットをビルドに含めるには、ビルドのカスタマイズを使用するようにプロジェクトを構成し、プロジェクトにアセットを追加し、正しいビルドのカスタマイズを使用するようにアセットを構成するだけです。その後でアプリケーションにアセットを読み込み、他の DirectX アプリケーションと同様に DirectX リソースを作成して入力することにより、アセットを使用できます。
プロジェクトを構成する
ビルドの一部として 3-D アセットを配置する前に、配置するアセットの種類について Visual Studio が認識している必要があります。Visual Studio は、多くの一般的なファイルの種類について既に認識していますが、3-D アセットを使用するのは、特定の種類のアプリケーションのみであるため、プロジェクトがこれらの種類のファイルをビルドすることを Visual Studio は想定していません。アセットの種類ごとに用意されているビルドのカスタマイズを使用することによって、これらの種類のアセットをアプリケーションが使用することを Visual Studio に指示できます。ビルドのカスタマイズは、さまざまな種類のファイルを便利な方法で処理する方法を Visual Studio に指示するファイルです。これらのカスタマイズはプロジェクトごとに適用されるため、プロジェクトに適切なカスタマイズを追加するだけで済みます。
プロジェクトにビルドのカスタマイズを追加するには
ソリューション エクスプローラーで、プロジェクトのショートカット メニューを開き、[ビルドのカスタマイズ] をクリックします。[Visual C++ ビルド カスタマイズ ファイル] ダイアログ ボックスが表示されます。
Visual Studio にこれらのビルドのカスタマイズを一回追加するだけで済みます。既に追加している場合は、この手順を省略できます。
[既存ファイルの検索] をクリックし、3-D アセットのビルドをサポートする 3 つのビルドのカスタマイズを含む Visual Studio installation directory\Common7\IDE\Extensions\Microsoft\VSGraphics\ に移動します。1 つのビルド カスタマイズ ファイル、たとえば ImageContentTask.targets を選択し、[開く] をクリックします。ビルドのカスタマイズの検索パスにディレクトリを追加するかどうかを確認するメッセージが表示されたら、[はい] をクリックします。これにより、3 つのビルドのカスタマイズをすべて使用できるようになります。
[一覧の更新] をクリックし、[使用できるビルド カスタマイズ ファイル] のグリッド ビュー コントロールを更新します。
[使用できるビルド カスタマイズ ファイル] のグリッド ビュー コントロールで、次の表に示すように、プロジェクトで使用するアセットの種類に対応するチェック ボックスをオンにします。
アセットの種類
ビルドのカスタマイズの名前
テクスチャおよびイメージ
ImageContentTask(.targets、.props)
3-D モデル
MeshContentTask(.targets、.props)
シェーダー
ShaderGraphContentTask(.targets、.props)
[OK] を選択します。
アセットをビルドに含める
使用する 3-D アセットの種類をプロジェクトが認識できるようになったので、次に、3-D アセットがどのファイルに含まれ、どのような種類のアセットであるかを指示します。
アセットをビルドに追加するには
ソリューション エクスプローラーのプロジェクトで、アセットのショートカット メニューを開き、[プロパティ] をクリックします。アセットの [プロパティ ページ] ダイアログ ボックスが表示されます。
[構成] と [プラットフォーム] の各プロパティが、変更を適用する値に設定されていることを確認します。
[構成プロパティ] の [全般] をクリックし、プロパティ グリッドの [全般] で、[項目の種類] プロパティを適切なコンテンツ パイプラインの項目の種類に設定します。たとえば、イメージまたはテクスチャのファイルの場合、[Image Content Pipeline] (イメージ コンテンツ パイプライン) を選択します。
重要既定では、Visual Studio は、多くの種類のイメージ ファイルが、Visual Studio にビルドされている [イメージ] 項目の種類を使用して分類する必要があることを前提としています。したがって、イメージ コンテンツ パイプラインにより処理する各イメージの [項目の種類] プロパティを変更する必要があります。3-D モデルおよび視覚シェーダー グラフィックスのその他の種類のコンテンツ パイプラインのソース ファイルの既定は、正しい [項目の種類] になります。
[OK] を選択します。
3 種類のコンテンツ パイプラインの項目の種類および関連のソース ファイルと出力ファイルの種類を、次に示します。
項目の種類 |
ソース ファイルの種類 |
出力ファイル形式 |
|---|---|---|
イメージ コンテンツ パイプライン |
ポータブル ネットワーク グラフィックス (PNG) (.png) JPEG (.jpg、.jpeg、.jpe、.jfif) DirectDraw Surface (dds) グラフィックス インターチェンジ形式 (GIF) (.gif) ビットマップ (.bmp、.dib) TIFF 形式 (.tif、.tiff) Targa (.tga) |
DirectDraw Surface (dds) |
メッシュ コンテンツ パイプライン |
AutoDesk FBX インターチェンジ ファイル (.fbx) Collada DAE ファイル (.dae) Wavefront OBJ ファイル (.obj) |
3-D メッシュ ファイル (.cmo) |
シェーダー コンテンツ パイプライン |
視覚シェーダー グラフ (.dgsl) |
コンパイル済みシェーダー出力 (.cso) |
アセット コンテンツ パイプラインのプロパティを構成する
特定の方法でビルドされるように、各アセット ファイルのコンテンツ パイプラインのプロパティを設定できます。
コンテンツ パイプラインのプロパティを構成するには
ソリューション エクスプローラーのプロジェクトで、アセット ファイルのショートカット メニューを開き、[プロパティ] をクリックします。アセットの [プロパティ ページ] ダイアログ ボックスが表示されます。
[構成] と [プラットフォーム] の各プロパティが、変更を適用する値に設定されていることを確認します。
[構成プロパティ] でコンテンツ パイプラインのノード、たとえばテクスチャおよびイメージのアセットの場合は [Image Content Pipeline] (イメージ コンテンツ パイプライン) を選択し、プロパティのグリッドで、プロパティを適切な値に設定します。たとえば、ビルド時に、テクスチャ アセットの MIPMAP を生成するには、[MIPS の生成] プロパティを [あり] に設定します。
[OK] を選択します。
イメージ コンテンツ パイプラインの構成
イメージ コンテンツ パイプライン ツールを使用してテクスチャ アセットをビルドする場合、さまざまな方法によるテクスチャの圧縮、ビルド時に MIPMAP レベルを生成するかどうかの指定、および出力ファイルの名前の変更を実行できます。
プロパティ |
説明 |
|---|---|
圧縮 |
出力ファイルで使用される圧縮の種類を指定します。 使用可能なオプションは次のとおりです。
DirectX のさまざまなバージョンでサポートされる圧縮形式の詳細については、「Programming Guide for DXGI (DXGI のプログラミング ガイド)」を参照してください。 |
MIPS の生成 |
完全な MIPMAP チェーンをビルド時に生成し、出力ファイルに含める場合は、[あり]、それ以外は [なし]。[なし] をクリックすると、ソース ファイルに既に MIPMAP チェーンが含まれている場合は、出力ファイルに MIPMAP チェーンが含まれます。それ以外の場合は、出力ファイルに MIPMAP チェーンは含まれません。 |
Content Output (コンテンツ出力) |
出力ファイルの名前を指定します。 重要
出力ファイルのファイル名拡張子を変更しても、ファイル形式には影響しません。
|
メッシュ コンテンツ パイプラインの構成
メッシュ コンテンツ パイプライン ツールを使用してメッシュ アセットをビルドする場合、出力ファイルの名前を変更できます。
プロパティ |
説明 |
|---|---|
Content Output (コンテンツ出力) |
出力ファイルの名前を指定します。 重要
出力ファイルのファイル名拡張子を変更しても、ファイル形式には影響しません。
|
シェーダー コンテンツ パイプラインの構成
シェーダー コンテンツ パイプライン ツールを使用してシェーダー アセットをビルドする場合、出力ファイルの名前を変更できます。
プロパティ |
説明 |
|---|---|
Content Output (コンテンツ出力) |
出力ファイルの名前を指定します。 重要
出力ファイルのファイル名拡張子を変更しても、ファイル形式には影響しません。
|
実行時の 3-D アセットの読み込みおよび使用
テクスチャおよびイメージを使用する
Direct3D には、テクスチャ リソースを作成するための機能があります。Direct3D 11 では、D3DX11 ユーティリティ ライブラリには、イメージ ファイルからテクスチャ リソースとリソース ビューを直接作成するための追加の機能が用意されています。Direct3D 11 でテクスチャ リソースを作成する方法の詳細については、「Textures (テクスチャ)」を参照してください。D3DX11 ライブラリをイメージ ファイルからのテクスチャのリソースまたはリソース ビューを作成する方法の詳細については、" "を参照してください。方法: ファイルからのテクスチャを初期化
3-D モデルを使用する
Direct3D 11 には、3-D モデルからリソースを作成する機能がありません。代わりに、3-D モデル ファイルを読み取るコードを記述し、3-D モデルおよびモデルが必要とするリソース (テクスチャ、シェーダーなど) を表す頂点バッファーとインデックス バッファーを作成する必要があります。
シェーダーを使用する
は、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;
};