インデックスバッファ
インデックスバッファも頂点バッファと流れや実装が殆ど同じです。
なので早速実装についてみていきましょう。
IndexBuffer.h
#pragma once #include "DirectX11.h" // IndexBufferクラス class IndexBuffer { public: IndexBuffer(void); ~IndexBuffer(void); // 初期化 bool Initialize(DirectX11& directX, UINT size, void* pInitData); // 終了処理 void Finalize(void); public: // バッファの取得 ID3D11Buffer* GetBuffer(void) { return m_pBuffer; } private: ID3D11Buffer* m_pBuffer; // バッファ };
インデックスバッファも名前が変わっただけで頂点バッファと同じです。
なのでベースとなるBufferクラスを作成して継承により個別に初期化処理を実装することも多いです。
IndexBuffer.cpp
#include "IndexBuffer.h" IndexBuffer::IndexBuffer() { m_pBuffer = NULL; } IndexBuffer::~IndexBuffer(void) { Finalize(); } bool IndexBuffer::Initialize(DirectX11& directX11, UINT size, void* pInitData) { auto pDevice = directX11.GetDevice(); D3D11_BUFFER_DESC desc; // 頂点バッファの初期化設定 desc.ByteWidth = size; desc.Usage = D3D11_USAGE_DEFAULT; desc.BindFlags = D3D11_BIND_INDEX_BUFFER; desc.CPUAccessFlags = 0; desc.MiscFlags = 0; desc.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA data; // 初期化時に設定するバッファデータ data.pSysMem = pInitData; data.SysMemPitch = 0; data.SysMemSlicePitch = 0; // 頂点バッファの生成 if (FAILED(pDevice->CreateBuffer(&desc, &data, &m_pBuffer))) { return false; } return true; } void IndexBuffer::Finalize() { SafeRelease(m_pBuffer); }
こちらも殆ど実装は同じですね!
今回の実装で違う部分は一か所だけです。
D3D11_BUFFER_DESCのBindFlagsに指定している設定がD3D11_BIND_INDEX_BUFFERになっています。
これで描画パイプライン上のインデックスバッファとして初期化が行われます。
後は全て同じです。
必要に応じて固有の実装をしていくこともありますが、単純に使用するだけであれば特に必要ありません。
初めてDirectX11を触ると難しいと感じる人も多いのですが、使用するだけなら意外と難しい処理は多くないので興味を持ったら描画まで実装を進めてみましょう!
では次回の記事ではDirectX11での描画に必須のシェーダ―について記述していきます。