図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(); }