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; //ルートパラメータの数 }