【DX12を学びたい】三角形を表示させる

三角形の表示 DirextX

シェーダーが用意できたら、使用するシェーダーの情報を設定しなければいけません。

その設定を行うのがグラフィックスパイプラインステートです。

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);

 

次は三角形を表示していきます。

かれいど

ゲームをしたり、作ったり
色々な事に挑戦していきたい!

サッカー観戦も趣味で
主にJ1リーグを観ています。

かれいどをフォローする
DirextX
スポンサーリンク
シェアする

コメント