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

参考資料

書籍

サイト

qiita.com

qiita.com

learn.microsoft.com