X-FILE を sdkmesh にコンバート

X-FILE を sdkmesh にコンバートして描画

X-FILE を meshconvert で sdkmesh にコンバートして描画します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. DirectX SDK には X-FILE を sdkmesh に変換するプログラム(meshconvert)が格納されています。
    これを使って Cone.x を Cone.sdkmesh に変換して描画してみましょう。
    Cone.x は LIGHTWAVE で作成したモデルで「頂点座標と法線ベクトルと色」で構成されています。
    Cone.x の取得と説明は X-FILE(Cone.x) の頂点データを定義する を参照して下さい。
  2. 最初に Cone.x を Cone.sdkmesh に変換します。
    DirectX Sample Browser から Tools で表示すると MeshConvert が見つかります。
    Sample Browser の説明は プログラムを自動的に作成する を参照して下さい。
    MeshConvert.exe を起動するとコマンドモードで立ち上がります。
    コマンドラインから次のコマンドをタイプして下さい。
    c:\tmp\cone.x が X-FILE の名前とパスで、変換された sdkmesh を保存するパスが c:\tmp\cone.sdkmesh です。
    meshconvert /o c:\tmp\cone.sdkmesh /sdkmesh c:\tmp\cone.x
    MeshConvert の詳細は XFILE ⇒ sdkmesh を使用して下さい。
  3. ベースとなるプロジェクトは Tiny.sdkmesh を描画する を使用して下さい。
    "COLOR" が設定されているはずなのですが、何故か色がうまく描画されません。
    そこで試しに "POSITION" と "NORMAL" を設定して描画してみました。
        // Define the input layout
        D3D10_INPUT_ELEMENT_DESC layout[] =
        {
            { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
            { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 },
        };
        
  4. Main.fx は「頂点座標+法線ベクトル」に光源を設定して描画するものを使います。
    float4 g_vColor = float4(1,1,0.2,1); がメッシュの色です。
    //--------------------------------------------------------------------------------------
    // File: Main.fx    頂点座標+法線ベクトル+光源        前田 稔
    //--------------------------------------------------------------------------------------
    
    //--------------------------------------------------------------------------------------
    // Constant Buffer Variables
    //--------------------------------------------------------------------------------------
    matrix World;
    matrix View;
    matrix Projection;
    
    //--------------------------------------------------------------------------------------
    // Global variables
    //--------------------------------------------------------------------------------------
    cbuffer cb0
    {
        float3 g_vLightDir = float3(-0.707,0.707,-0.5); // 光源の座標
    //    float4 g_vColor = float4(1,0.5,0.5,1);          // メッシュの色
        float4 g_vColor = float4(1,1,0.2,1);            // メッシュの色
    };
    
    //--------------------------------------------------------------------------------------
    // Vertex shader output structure
    //--------------------------------------------------------------------------------------
    struct VS_INPUT
    {
        float4 Pos : POSITION;
        float4 Norm : NORMAL;
    };
    
    struct PS_INPUT
    {
        float4 Pos : SV_POSITION;
        float4 Norm : NORMAL;
    };
    
    //--------------------------------------------------------------------------------------
    // Vertex Shader
    //--------------------------------------------------------------------------------------
    PS_INPUT VS( VS_INPUT input )
    {
        PS_INPUT output = (PS_INPUT)0;
        output.Pos = mul( input.Pos, World );
        output.Pos = mul( output.Pos, View );
        output.Pos = mul( output.Pos, Projection );
        output.Norm = mul( input.Norm, World );
        
        return output;
    }
    
    //--------------------------------------------------------------------------------------
    float4 PS( PS_INPUT input ) : SV_Target
    { 
        return g_vColor * saturate( dot( normalize(input.Norm), g_vLightDir ) );
    }
    
    //--------------------------------------------------------------------------------------
    technique10 Render
    {
        pass P0
        {
            SetVertexShader( CompileShader( vs_4_0, VS() ) );
            SetGeometryShader( NULL );
            SetPixelShader( CompileShader( ps_4_0, PS() ) );
        }
    }
    

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(DirectX10 game program)