シェーダーが用意できたら、使用するシェーダーの情報を設定しなければいけません。
その設定を行うのがグラフィックスパイプラインステートです。
1:ルートシグネチャの作成
2:シェーダーの準備
3:グラフィックスパイプラインステートの作成
4:三角形の表示
パイプラインステート
グラフィックスパイプラインステートの作成です。
CreateGraphicsPipelineStateを使用します。
D3D12_GRAPHICS_PIPELINE_STATE_DESCの設定を行います。
// シェーダーコンパイル部分
// グラフィックスパイプラインの設定
D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
// ルートシグネチャを設定
psoDesc.pRootSignature = m_pRootSignature;
// シェーダーの設定
psoDesc.VS.pShaderBytecode = pVertexShader->GetBufferPointer();
psoDesc.VS.BytecodeLength = pVertexShader->GetBufferSize();
psoDesc.PS.pShaderBytecode = pPixelShader->GetBufferPointer();
psoDesc.PS.BytecodeLength = pPixelShader->GetBufferSize();
// ストリーミング出力の設定
psoDesc.StreamOutput.pSODeclaration = nullptr;
psoDesc.StreamOutput.NumEntries = 0;
psoDesc.StreamOutput.pBufferStrides = nullptr;
psoDesc.StreamOutput.NumStrides = 0;
psoDesc.StreamOutput.RasterizedStream = 0;
// ブレンドの状態を設定
psoDesc.BlendState.AlphaToCoverageEnable = FALSE;
psoDesc.BlendState.IndependentBlendEnable = FALSE;
const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc =
{
FALSE,FALSE,
D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
D3D12_LOGIC_OP_NOOP,
D3D12_COLOR_WRITE_ENABLE_ALL,
};
for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) {
psoDesc.BlendState.RenderTarget[i] = defaultRenderTargetBlendDesc;
}
psoDesc.SampleMask = D3D12_DEFAULT_SAMPLE_MASK;
// ラスタライザーの状態を設定
psoDesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
psoDesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;
psoDesc.RasterizerState.FrontCounterClockwise = FALSE;
psoDesc.RasterizerState.DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
psoDesc.RasterizerState.DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
psoDesc.RasterizerState.SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
psoDesc.RasterizerState.DepthClipEnable = TRUE;
psoDesc.RasterizerState.MultisampleEnable = FALSE;
psoDesc.RasterizerState.AntialiasedLineEnable = FALSE;
psoDesc.RasterizerState.ForcedSampleCount = 0;
psoDesc.RasterizerState.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
// 深度、ステンシルテストは無効
psoDesc.DepthStencilState.DepthEnable = FALSE;
psoDesc.DepthStencilState.StencilEnable = FALSE;
// 入力アセンブラー:頂点のレイアウト
D3D12_INPUT_ELEMENT_DESC inputElementDescs[] =
{
{
"POSITION", // セマンティック名
0, // セマンティックのインデックス
DXGI_FORMAT_R32G32B32_FLOAT, // フォーマット
0, // 入力スロット
0,
D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, // 頂点データ
0
},
{
"COLOR", // セマンティック名
0, // セマンティックのインデックス
DXGI_FORMAT_R32G32B32A32_FLOAT, // フォーマット
0, // 入力スロット
12, // 頂点の先頭からこの要素へのオフセット(Byte)
D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, // 頂点データ
0
},
};
psoDesc.InputLayout = { inputElementDescs, _countof(inputElementDescs) };
// 三角形ストリップではない
psoDesc.IBStripCutValue = D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED;
// 入力プリミティブは三角形
psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
// レンダーターゲットの数
psoDesc.NumRenderTargets = 1;
// レンダーターゲットのフォーマット
psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
// 深度、ステンシルのフォーマット
psoDesc.DSVFormat = DXGI_FORMAT_UNKNOWN;
// マルチサンプリングの設定
psoDesc.SampleDesc.Count = 1;
psoDesc.SampleDesc.Quality = 0;
// GPUアダプターが1つなら0
psoDesc.NodeMask = 0;
// キャッシュなし
psoDesc.CachedPSO.pCachedBlob = nullptr;
psoDesc.CachedPSO.CachedBlobSizeInBytes = 0;
// フラグ
psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
// グラフィックスパイプラインステートの作成
HRESULT result = m_pDevice->CreateGraphicsPipelineState(
&psoDesc,
IID_PPV_ARGS(&m_pPipelineState)
);
// シェーダーリリース部分
今回は三角形を表示するだけなので、無効にしている部分が多いです。
コマンドリストに設定
作成とリセットにパイプラインステートを設定します。
// 作成
CreateCommandList(
0,
D3D12_COMMAND_LIST_TYPE_DIRECT,
m_pCommandAllocator,
m_pPipelineState,
IID_PPV_ARGS(&m_pCommandList)
);
// リセット
m_pCommandList->Reset(m_pCommandAllocator, m_pPipelineState);
次は三角形を表示していきます。
コメント