ホーム < ゲームつくろー! < DirectX10技術編

その4 Xファイルからモデルを読み込んでみる : サンプルプログラム



 DirectX10技術編その4「Xファイルからモデルを読み込んでみる」で説明した内容を踏まえたサンプルプログラムです。実行すると、Xファイルから読み込んだキューブモデルが回転します。


サンプルスクリーンショット

 上のプログラムを動かすには、こちらからソースをダウンロードして下さい。解凍されたファイルをすべてプロジェクトファイル直下に置き、.hと.cppをプロジェクトに追加してコンパイルすると実行できます。main.cppがメインです。LoadD3DX10Mesh.cppにはXファイルからID3DX10Meshインターフェイスを作る関数が入っています。DixComPtr.hはCOMポインタです。

○ プログラムのポイント

 このプログラムのポイントは何と言ってもXファイルからID3DX10Meshを作る部分です。ここはD3DX10LoadMesh.cppに関数として分離しました。内部ではXファイルをDirectX9の力を借りて読み込み、その情報をID3DX10Meshに流し込んでいます。詳しい事はDirectX10技術編その4をご覧下さい。


○ シェーダファイル

 参考としてこのサンプルプログラムで使用しているシェーダファイルを示します:

float4x4 g_World;
float4x4 g_View;
float4x4 g_Proj;

struct VS_OUTPUT {
   float4 Pos : SV_POSITION;
   float4 Diffuse : COLOR0;
};

VS_OUTPUT VS( float4 Pos : POSITION, float3 Normal : NORMAL )
{
        VS_OUTPUT Out=(VS_OUTPUT)0;
        
        // 射影空間へ変換
        float4x4 WorldView = mul(g_World, g_View);
        Out.Pos = mul(Pos, WorldView);
        Out.Pos = mul(Out.Pos, g_Proj);

        float3 ViewNormal = normalize( mul( Normal, WorldView ) );
        float col = dot( ViewNormal, float3(0.0f, 0.0f, -1.0f) );
        Out.Diffuse = float4( col,  col, col, 1.0f);
    return Out;
}


float4 PS( float4 Pos : SV_POSITION, float4 Diffuse : COLOR0 ) : SV_Target
{
    return Diffuse;
}


// Technique Definition
technique10 SimpleRender
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );
    }
}


 このサンプルではライトは目線方向(Z軸方向)にしています。頂点シェーダに入力された法線(Normal)にWorldView行列を掛けてカメラ空間に移し、それを正規化してViewNormalに格納しています。ライト方向の逆(0,0,-1)と正規化法線の内積を取ると反射する光の強さが算出されてきますので、それを頂点シェーダの出力カラーにしています。ピクセルシェーダはそのカラーを返しているだけです。