DirectX12 ③ 頂点バッファの作成
頂点バッファの作成
GPUに頂点のデータを渡すためのバッファ。
環境
言語 : C++
開発環境 : Visual Studio 2020
OS : Windows10
CPU : AMD Ryzen5 3600
RAM : 24.0GB
GPU : NVIDIA GeForce GTX 1050
ソースコード
VertexBuffer.h
#pragma once #include <d3d12.h> #include <cstdint> #include <wrl/client.h> #include <iostream> #include "Dx.h" #pragma comment(lib, "d3d12.lib") class VertexBuffer { public: VertexBuffer(); bool CreateVertexBuffer(size_t size, size_t stride, const void* data); D3D12_VERTEX_BUFFER_VIEW GetVertexBufferView() const; private: ComPtr<ID3D12Resource> _pVertexBuffer; D3D12_VERTEX_BUFFER_VIEW _vertexBufferView; };
VertexBuffer.cpp
#include "VertexBuffer.h" //初期化 VertexBuffer::VertexBuffer() { _vertexBufferView = {}; } //頂点バッファの作成 bool VertexBuffer::CreateVertexBuffer(size_t size, size_t stride, const void* 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; hResult = dx->GetDevice()->CreateCommittedResource(&heapProp, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(_pVertexBuffer.GetAddressOf())); if (FAILED(hResult)) { std::cout << "Failed to create VertexBuffer" << std::endl; return false; } //マッピング void* ptr = nullptr; hResult = _pVertexBuffer->Map(0, nullptr, &ptr); if (FAILED(hResult)) { std::cout << "Failed mapping VertexBuffer" << std::endl; return false; } memcpy(ptr, data, size); //コピー _pVertexBuffer->Unmap(0, nullptr); _vertexBufferView.BufferLocation = _pVertexBuffer->GetGPUVirtualAddress(); //アドレス _vertexBufferView.SizeInBytes = static_cast<uint32_t>(size); //頂点データのサイズ _vertexBufferView.StrideInBytes = static_cast<uint32_t>(stride); //1頂点あたりのデータサイズ return true; } //頂点バッファビューの取得 D3D12_VERTEX_BUFFER_VIEW VertexBuffer::GetVertexBufferView() const { return _vertexBufferView; }