DirectX12 ④ インデックスバッファの作成
インデックスバッファの作成
GPUにインデックスのデータを渡すためのバッファ。
環境
言語 : C++
開発環境 : Visual Studio 2020
OS : Windows10
CPU : AMD Ryzen5 3600
RAM : 24.0GB
GPU : NVIDIA GeForce GTX 1050
ソースコード
IndexBuffer.h
#pragma once #include <d3d12.h> #include <cstdint> #include <wrl/client.h> #include <iostream> #include "Dx.h" #pragma comment(lib, "d3d12.lib") using namespace Microsoft::WRL; class IndexBuffer { public: IndexBuffer(); bool CreateIndexBuffer(size_t size, uint32_t* data); D3D12_INDEX_BUFFER_VIEW GetIndexBufferView(); private: ComPtr<ID3D12Resource> _pBuffer; D3D12_INDEX_BUFFER_VIEW _indexBufferView; };
IndexBuffer.cpp
#include "IndexBuffer.h" //初期化 IndexBuffer::IndexBuffer() { _indexBufferView = {}; } //インデックスバッファの作成 bool IndexBuffer::CreateIndexBuffer(size_t size, uint32_t* data) { //ヒーププロパティ D3D12_HEAP_PROPERTIES heapProp = {}; heapProp.Type = D3D12_HEAP_TYPE_UPLOAD; //GPUにアップロード heapProp.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; heapProp.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; heapProp.CreationNodeMask = 0; heapProp.VisibleNodeMask = 0; //リソースの設定(バッファ用) D3D12_RESOURCE_DESC desc = {}; desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; //バッファ用 desc.Alignment = 0; //配置 desc.Width = size; //リソースの幅(データのサイズ) desc.Height = 1; //リソースの高さ desc.DepthOrArraySize = 1; //深さ desc.MipLevels = 1; //ミップマップはしない desc.Format = DXGI_FORMAT_UNKNOWN; //形式は指定しない desc.SampleDesc.Count = 1; //サンプリングはしない desc.SampleDesc.Quality = 0; desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; desc.Flags = D3D12_RESOURCE_FLAG_NONE; //リソースの作成 HRESULT hResult = dx->GetDevice()->CreateCommittedResource(&heapProp, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(_pBuffer.GetAddressOf())); if (FAILED(hResult)) { std::cout << "Failed to create IndexBuffer" << std::endl; return false; } //インデックスバッファビュー _indexBufferView.BufferLocation = _pBuffer->GetGPUVirtualAddress(); //アドレス _indexBufferView.Format = DXGI_FORMAT_R32_UINT; //形式はunsigned int 32ビット _indexBufferView.SizeInBytes = static_cast<uint32_t>(size); //データのサイズ //マッピング if (data != nullptr) { void* ptr = nullptr; hResult = _pBuffer->Map(0, nullptr, &ptr); if (FAILED(hResult)) { std::cout << "Failed mapping IndexBuffer" << std::endl; return false; } memcpy(ptr, &data[0], size); //コピー _pBuffer->Unmap(0, nullptr); } return true; } //インデックスバッファビューの取得 D3D12_INDEX_BUFFER_VIEW IndexBuffer::GetIndexBufferView() { return _indexBufferView; }