LoginSignup
0
0

More than 3 years have passed since last update.

DirectX12の CreateGraphicsPipelineState で E_INVALIDARG One or more arguments are invalid.が出た話

Last updated at Posted at 2020-08-29

解決した方法

プロジェクトファイルがある同じフォルダ内に
dxil.dllを入れたら直った。
このファイルは通常
C:\Program Files (x86)\Windows Kits\10\Redist\D3D\x64
この中にあります。
同様にdxcompiler.dllこのファイルも一緒に入れるとシェーダーのコンパイルでエラーになってる人は幸せになれるかもしれません。(同じ階層にあります)

コードはこんな感じです。

    // インプットレイアウト
    D3D12_INPUT_ELEMENT_DESC inputElementDesc[] = {
      { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, pos), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA},
      { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT,0, offsetof(Vertex,normal), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA},
      { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(Vertex,uv), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA}
    };

    // パイプラインステートオブジェクトの生成.
    D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc{};
    // シェーダーのセット
    psoDesc.VS = CD3DX12_SHADER_BYTECODE(m_Vs.Get());
    psoDesc.PS = CD3DX12_SHADER_BYTECODE(m_PsOpaque.Get());
    // ブレンドステート設定
    psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
    // ラスタライザーステート
    psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT);
    // 出力先は1ターゲット
    psoDesc.NumRenderTargets = 1;
    psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
    // デプスバッファのフォーマットを設定
    psoDesc.DSVFormat = DXGI_FORMAT_D32_FLOAT;
    psoDesc.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT);
    psoDesc.InputLayout = { inputElementDesc, _countof(inputElementDesc) };

    // ルートシグネチャのセット
    psoDesc.pRootSignature = m_RootSignature.Get();
    psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
    // マルチサンプル設定
    psoDesc.SampleDesc = { 1,0 };
    psoDesc.SampleMask = UINT_MAX; // これを忘れると絵が出ない&警告も出ないので注意.

    ComPtr<ID3D12PipelineState> pipeline;
    HRESULT hr;
    hr = m_Device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&pipeline));
    if (FAILED(hr))
    {
        throw std::runtime_error("CreateGraphicsPipelineState failed");
    }
    return pipeline;

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0