DirectX12 ⑤ ルートシグネチャの作成

ルートシグネチャの作成 

環境

言語 : C++
開発環境 : Visual Studio 2020
OS : Windows10
CPU : AMD Ryzen5 3600
RAM : 24.0GB
GPU : NVIDIA GeForce GTX 1050

ソースコード

RootSignature.h

#pragma once

#include <d3d12.h>
#include <cstdint>
#include <wrl/client.h>
#include <iostream>

#include "Dx.h"
#include "DxStruct.h"

#pragma comment(lib, "d3d12.lib")

using namespace Microsoft::WRL;

class RootSignature
{
public:
    RootSignature();
    void SetRootParameter(D3D12_ROOT_PARAMETER* rootParam, uint32_t rootParamNum);
    bool CreatRootSignature();

    ID3D12RootSignature* GetRootSignature();

private:
    D3D12_ROOT_SIGNATURE_DESC _desc;

    ComPtr<ID3D12RootSignature> _pRootSignature;

    ComPtr<ID3DBlob> pBlob;
    ComPtr<ID3DBlob> pErrorBlob;
};



RootSignature.cpp

#include "RootSignature.h"

RootSignature::RootSignature() {
    _desc = {};
}

//ルートシグネチャの作成
bool RootSignature::CreatRootSignature() {
    auto flag = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;   //入力アセンブラの使用を宣言
    flag |= D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS;   //ドメインシェーダからアクセスを拒否
    flag |= D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS;     //ハルシェーダからアクセスを拒否
    flag |= D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS; //ジオメトリシェーダからアクセスを拒否


    //サンプラーの設定
    D3D12_STATIC_SAMPLER_DESC sampler = {};
    sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP; //テクスチャをタイル化
    sampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
    sampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
    sampler.MipLODBias = 0.0f;
    sampler.MaxAnisotropy = 16;
    sampler.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
    sampler.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
    sampler.MaxLOD = D3D12_FLOAT32_MAX;
    sampler.MinLOD = 0.0f;
    sampler.ShaderRegister = 0; //0番目(ピクセルシェーダからはs0で参照できる)
    sampler.RegisterSpace = 0;
    sampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;   //ピクセルシェーダから見えるようにする
    sampler.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;

    _desc.NumStaticSamplers = 1;    //サンプラーの数は1
    _desc.pStaticSamplers = &sampler;
    _desc.Flags = flag;

    HRESULT hResult = D3D12SerializeRootSignature(&_desc, D3D_ROOT_SIGNATURE_VERSION_1_0, pBlob.GetAddressOf(), pErrorBlob.GetAddressOf());
    if (FAILED(hResult)) {
        std::cout << "Failed to serialize RootSignature" << std::endl;
        return false;
    }

    hResult = dx->GetDevice()->CreateRootSignature(0, pBlob->GetBufferPointer(), pBlob->GetBufferSize(), IID_PPV_ARGS(_pRootSignature.GetAddressOf()));
    if (FAILED(hResult)) {
        std::cout << "Failed to create RootSignature" << std::endl;
        return false;
    }

    return true;
}

//ルートシグネチャを取得
ID3D12RootSignature* RootSignature::GetRootSignature() {
    return _pRootSignature.Get();
}

//ルートパラメータをセット
void RootSignature::SetRootParameter(D3D12_ROOT_PARAMETER* rootParam, uint32_t rootParamNum) {
    _desc.pParameters = rootParam;
    _desc.NumParameters = rootParamNum; //ルートパラメータの数
}

参考資料

書籍

サイト

qiita.com

qiita.com

learn.microsoft.com