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

参考資料

書籍

サイト

qiita.com

learn.microsoft.com