今回はDirectX11での頂点バッファとインデックスバッファの作り方について記載していきます。
頂点バッファとインデックスバッファの意味合いについてはDirectX9と同等です。
なのでこの記事ではバッファの作り方をメインに記述していきます。
DirectX11では固定パイプラインが廃止されたので描画はShaderの記事を書いてからになります。
実装部分には前回の初期化の続きになるので、DirectX11クラスなどはそちらの記事をご確認ください!
では早速みていきましょう!
頂点バッファ
DirectX9の記事にも書いていますが頂点バッファとは頂点情報の塊のことです。
頂点バッファで管理する情報には以下のようなものがあります。
| 座標 | ポリゴンを表示する座標を設定できます。 |
|---|---|
| 法線 | 法線の向き(ライトが影響する向き)を設定できます。 |
| カラー | 頂点に色を設定できます。 |
| テクスチャ―UV | テクスチャ―を張り付けるUV値を設定できます。 |
| 影響するボーン | 頂点にアニメーションを付ける際に影響するボーンを設定できます。 |
| ウェイト | 各ボーンに対する影響度を設定できます。 |
よく使用するところを記載しましたが、
頂点バッファには他にもいろいろな情報を持たせることができます。
逆に座標だけなどで使用することもできます。
これらの情報を扱いシェーダ―でモデルの形状や質感を出していきます。
では頂点バッファのデータを管理するクラスの実装を見ていきましょう。
VertexBuffer.h
#pragma once
#include "DirectX11.h"
// VertexBufferクラス
class VertexBuffer
{
public:
VertexBuffer(void);
~VertexBuffer(void);
// 初期化
bool Initialize(DirectX11& directX, UINT size, void* pInitData);
// 終了処理
void Finalize(void);
public:
// バッファの取得
ID3D11Buffer* GetBuffer(void) { return m_pBuffer; }
private:
ID3D11Buffer* m_pBuffer; // バッファ
};
必要な機能は単純です。
DirectX11でのバッファを管理するID3D11Bufferを初期化・解放する機能。
そしてバッファを取得できるようにしているだけです。
DirectX11では様々なバッファがID3D11Bufferで管理されています。
後で出てくるインデックスバッファも同様です。
このバッファを使って頂点バッファを作成する処理を記述していきます。
VertexBuffer.cpp
#include "VertexBuffer.h"
VertexBuffer::VertexBuffer()
{
m_pBuffer = NULL;
}
VertexBuffer::~VertexBuffer(void)
{
Finalize();
}
bool VertexBuffer::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_VERTEX_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 VertexBuffer::Finalize()
{
SafeRelease(m_pBuffer);
}
頂点バッファの作成は単純です。
基本的にはD3D11_BUFFER_DESCのBindFlagsにD3D11_BIND_VERTEX_BUFFERを指定するだけです。
他には頂点バッファのサイズやCPUからのアクセスできるようにするかの設定があります。
これらの設定を元に頂点バッファの生成が行われます。
次にD3D11_SUBRESOURCE_DATAで初期化時に頂点バッファの内容を書き込むことができます。
pSysMemに指定されたデータがバッファにコピーされます。
最後にそれらの設定を使ってID3D11DeviceからCreateBufferを呼び出すだけです。
短いコードで作れるので意外と簡単に感じたのではないでしょうか?