Direct3D Reader

Direct3D Reader

BasicReaderWriter を使って Shader を入力します。

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

プロジェクトの説明

  1. Shader の入力に BasicReaderWriter を使います。
    BasicReaderWriter は DirectX の基本入出力です。
    前回は Shader を非同期で読み込み込んでいましたが、reader->ReadData() で読み込みます。
    こちらの方が、多少プログラムがシンプルです。
    ベースのプロジェクトは Direct3D App を参照して下さい。
  2. 3DTutorial\Lesson3.Cubes から BasicReaderWriter.h(.cpp) をコピーしてプロジェクトに加えます。
  3. Model.cpp の修正です。
    m_loadingComplete は、非同期読み込みのフラグで、不要になります。
    #include "BasicReaderWriter.h"
    
        //m_loadingComplete(false),
    
  4. Vertex Shader の設定です。
        BasicReaderWriter^ reader = ref new BasicReaderWriter();
    
        // Vertex Shader の設定
        auto vertexData = reader->ReadData("SimpleVertexShader.cso");
        DX::ThrowIfFailed(
            m_d3dDevice->CreateVertexShader(
                vertexData->Data, vertexData->Length, nullptr, &m_vertexShader));
    
        // InputLayout の定義
        const D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
        {
            { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,  0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
            { "COLOR",    0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        };
    
        DX::ThrowIfFailed(
            m_d3dDevice->CreateInputLayout(
                vertexDesc, ARRAYSIZE(vertexDesc),
                vertexData->Data, vertexData->Length, &m_inputLayout));
    
  5. Pixel Shader の設定です。
        // Pixel Shader の設定
        auto pixelData = reader->ReadData("SimplePixelShader.cso");
    
        DX::ThrowIfFailed(
            m_d3dDevice->CreatePixelShader(
                pixelData->Data, pixelData->Length, nullptr, &m_pixelShader));
    
        CD3D11_BUFFER_DESC constantBufferDesc(
            sizeof(ModelViewProjectionConstantBuffer), D3D11_BIND_CONSTANT_BUFFER);
        DX::ThrowIfFailed(
            m_d3dDevice->CreateBuffer(&constantBufferDesc, nullptr, &m_constantBuffer));
    
  6. モデルの生成も createModelTask(非同期処理)を外します。
        // モデルの頂点座標を定義
        VertexPosition cubeVertices[] = 
        {
            {XMFLOAT3(-0.5f, -0.5f, -0.5f), XMFLOAT3(0.0f, 0.0f, 0.0f)},
            {XMFLOAT3(-0.5f, -0.5f,  0.5f), XMFLOAT3(0.0f, 0.0f, 1.0f)},
            {XMFLOAT3(-0.5f,  0.5f, -0.5f), XMFLOAT3(0.0f, 1.0f, 0.0f)},
            {XMFLOAT3(-0.5f,  0.5f,  0.5f), XMFLOAT3(0.0f, 1.0f, 1.0f)},
            {XMFLOAT3( 0.5f, -0.5f, -0.5f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
            {XMFLOAT3( 0.5f, -0.5f,  0.5f), XMFLOAT3(1.0f, 0.0f, 1.0f)},
            {XMFLOAT3( 0.5f,  0.5f, -0.5f), XMFLOAT3(1.0f, 1.0f, 0.0f)},
            {XMFLOAT3( 0.5f,  0.5f,  0.5f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
        };
    
        // モデルの頂点 Index を定義
        unsigned short modelIndices[] = 
        {   0,2,1,    1,2,3,
            4,5,6,    5,7,6,
            0,1,5,    0,5,4,
            2,6,7,    2,7,3,
            0,4,6,    0,6,2,
            1,3,7,    1,7,5,
        };
    
        D3D11_SUBRESOURCE_DATA vertexBufferData = {0};
        vertexBufferData.pSysMem = cubeVertices;
        vertexBufferData.SysMemPitch = 0;
        vertexBufferData.SysMemSlicePitch = 0;
        CD3D11_BUFFER_DESC vertexBufferDesc(sizeof(cubeVertices), D3D11_BIND_VERTEX_BUFFER);
        DX::ThrowIfFailed(
            m_d3dDevice->CreateBuffer(
                &vertexBufferDesc, &vertexBufferData, &m_vertexBuffer));
    
        m_indexCount = ARRAYSIZE(modelIndices);
    
        D3D11_SUBRESOURCE_DATA indexBufferData = {0};
        indexBufferData.pSysMem = modelIndices;
        indexBufferData.SysMemPitch = 0;
        indexBufferData.SysMemSlicePitch = 0;
        CD3D11_BUFFER_DESC indexBufferDesc(sizeof(modelIndices), D3D11_BIND_INDEX_BUFFER);
        DX::ThrowIfFailed(
            m_d3dDevice->CreateBuffer(
                &indexBufferDesc, &indexBufferData, &m_indexBuffer));
    }
    
  7. Render() では m_loadingComplete の判定は不要です。
        // モデルの準備ができていない時(読み込みは非同期です)
        //if (!m_loadingComplete)     {   return;  }
    
  8. Shader は自動生成のプロジェクトからコピーして下さい。
    説明が足りない所は Lesson3 立方体 のソースコードを参照して下さい。
    Main.cpp が、このページを作成するに当たって、参照したプログラムです。

超初心者のプログラム入門(DirectX Store)