図0001a
void TriangleObject::OnCreate() {
//頂点を作成するための配列
vector<VertexPositionColor> vertices = {
{ Vec3(0.0f, 0.5f , 0.0f),Col4(1.0f, 0.0f, 0.0f, 1.0f) },
{ Vec3(0.5f, -0.5f, 0.5f),Col4(0.0f, 1.0f, 0.0f, 1.0f) },
{ Vec3(-0.5f, -0.5f, 0.5f),Col4(0.0f, 0.0f, 1.0f, 1.0f) }
};
m_TriangleMesh = MeshResource::CreateMeshResource(vertices,false);
CreateRootSignature();
CreatePipelineState();
CreateCommandList();
}
【ルートシグネチャ】シェーダに入力する内容の設定 【パイプラインステート】どのシェーダを使うか、ラスタライザステートやデプスステンシルステートなどの 各レンダリングステートを設定する。 【コマンドリスト】描画命令や、頂点の型の設定など実際に描画するときに実行する「命令」をコマンドリストという、 命令の手順を定義したものを作成して、それを「実行する」という形で、描画する。
///ルートシグネチャ作成
void TriangleObject::CreateRootSignature() {
m_RootSignature = RootSignature::CreateSimple();
}
//一番シンプルなルートシグネチャ
static inline ComPtr<ID3D12RootSignature> CreateSimple() {
auto Dev = App::GetApp()->GetDeviceResources();
ComPtr<ID3D12RootSignature> Ret = Dev->GetRootSignature(L"Simple");
if (Ret != nullptr) {
return Ret;
}
CD3DX12_ROOT_SIGNATURE_DESC rootSignatureDesc;
rootSignatureDesc.Init(0, nullptr, 0, nullptr,
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT);
Ret = CreateDirect(rootSignatureDesc);
Dev->SetRootSignature(L"Simple", Ret);
return Ret;
}
///パイプラインステート作成
void TriangleObject::CreatePipelineState() {
//パイプラインステートの定義
D3D12_GRAPHICS_PIPELINE_STATE_DESC PineLineDesc;
m_PipelineState
= PipelineState::CreateDefault2D<VertexPositionColor,
VSPCDirect, PSPCDirect>(m_RootSignature, PineLineDesc);
}
///コマンドリスト作成
void TriangleObject::CreateCommandList() {
m_CommandList = CommandList::CreateDefault(m_PipelineState);
CommandList::Close(m_CommandList);
}
///描画処理
void TriangleObject::DrawObject() {
auto Dev = App::GetApp()->GetDeviceResources();
//コマンドリストのリセット
CommandList::Reset(m_PipelineState, m_CommandList);
//メッシュが更新されていればリソース更新
m_TriangleMesh->UpdateResources<VertexPositionColor>(m_CommandList);
m_CommandList->SetGraphicsRootSignature(m_RootSignature.Get());
m_CommandList->RSSetViewports(1, &Dev->GetViewport());
m_CommandList->RSSetScissorRects(1, &Dev->GetScissorRect());
//レンダーターゲットビューのハンドルを取得
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle = Dev->GetRtvHandle();
//デプスステンシルビューのハンドルを取得
CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle = Dev->GetDsvHandle();
//取得したハンドルをセット
m_CommandList->OMSetRenderTargets(1, &rtvHandle, FALSE, &dsvHandle);
m_CommandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
m_CommandList->IASetVertexBuffers(0, 1, &m_TriangleMesh->GetVertexBufferView());
m_CommandList->DrawInstanced(m_TriangleMesh->GetNumVertices(), 1, 0, 0);
//コマンドリストのクローズ
CommandList::Close(m_CommandList);
//デバイスにコマンドリストを送る
Dev->InsertDrawCommandLists(m_CommandList.Get());
}
//--------------------------------------------------------------------------------------
/// ゲームシーン
//--------------------------------------------------------------------------------------
class Scene : public SceneInterface {
shared_ptr<TriangleObject> m_TriangleObject;
public:
//中略
};
void Scene::OnCreate() {
//三角形の作成
m_TriangleObject = ObjectFactory::Create<TriangleObject>();
}
void Scene::OnDraw() {
//描画デバイスの取得
auto Dev = App::GetApp()->GetDeviceResources();
Dev->ClearDefaultViews(Col4(0, 0, 0, 1.0));
//デフォルト描画の開始
Dev->StartDefaultDraw();
//三角形の描画
m_TriangleObject->OnDraw();
//デフォルト描画の終了
Dev->EndDefaultDraw();
}