ゲーム中固定で使用されるリソースの作成 - yoshimune/LearningDirectX11 GitHub Wiki
- 頂点シェーダー
- ピクセルシェーダー
- 入力レイアウト
- 頂点バッファ
- インデックスバッファ
- 定数バッファ
- ラスタライザステート
- デプス・ステンシルステート
- ブレンドステート
シェーダーはバイナリデータとしてファイルから読み込む必要があります。よって、以下のようなヘルパーstructを作成しました。機能としては、ファイルパスを受け取って、対象のファイルをオープン→バイナリデータを読み込み→クローズを行っています。
// バイナリデータ管理
struct BinaryData
{
private:
int size_;
std::unique_ptr<char> binary_;
public:
BinaryData(const wchar_t* file_path)
{
// ファイルからバイナリデータを読み込む
std::ifstream file(file_path, std::ios::in | std::ios::binary);
if (file.is_open())
{
int file_size = static_cast<int>(file.seekg(0, std::ios::end).tellg());
file.seekg(0, std::ios::beg);
std::unique_ptr<char> code(new char[file_size]);
file.read(code.get(), file_size);
size_ = file_size;
binary_ = std::move(code);
}
}
const void* get() const { return binary_.get(); }
int size() const { return size_; }
};
シェーダーオブジェクトを作成します。
// Shader =====================================================================
// バイナリファイルからシェーダーを読み込みます
BinaryData vertex_shader_code(L"vertexShader.cso");
BinaryData pixel_shader_code(L"pixelShader.cso");
// 頂点シェーダ作成
DX::ThrowIfFailed(
d3d_device_->CreateVertexShader(vertex_shader_code.get(), vertex_shader_code.size(), NULL, d3d_vertex_shader_.GetAddressOf())
);
// ピクセルシェーダ作成
DX::ThrowIfFailed(
d3d_device_->CreatePixelShader(pixel_shader_code.get(), pixel_shader_code.size(), NULL, d3d_pixel_shader_.GetAddressOf())
);
入力レイアウトはDirectX レンダリングパイプラインの 入力アセンブラステージ(input-Assembler stage) で使用される入力バッファデータです。
// 入力レイアウト =========================================================
// 入力レイアウト定義
D3D11_INPUT_ELEMENT_DESC layout[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
UINT element_num = _countof(layout);
// 入力レイアウト作成
DX::ThrowIfFailed(
d3d_device_->CreateInputLayout(layout, element_num, vertex_shader_code.get(), vertex_shader_code.size(), d3d_vertex_layout_.GetAddressOf())
);
// 頂点バッファ定義
VertexData vertices[] = {
{ 0.0f, 0.5f, 0.0f},
{ 0.5f, -0.5f, 0.0f},
{ -0.5f, -0.5f, 0.0f},
};
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(VertexData) * 3;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = vertices;
// 頂点バッファ作成
DX::ThrowIfFailed(
d3d_device_->CreateBuffer(&bd, &InitData, d3d_vertex_buffer_.GetAddressOf())
);
UINT indices[] = { 0,1,2 };
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(int) * 3;
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = indices;
// インデックスバッファ作成
DX::ThrowIfFailed(
d3d_device_->CreateBuffer(&bd, &InitData, d3d_index_buffer_.GetAddressOf())
);
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(ConstantBuffer);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
DX::ThrowIfFailed(
d3d_device_->CreateBuffer(&bd, nullptr, d3d_cbuffer_.GetAddressOf())
);
CD3D11_DEFAULT default_state;
CD3D11_RASTERIZER_DESC rs_desc(default_state);
rs_desc.CullMode = D3D11_CULL_NONE;
DX::ThrowIfFailed(
d3d_device_->CreateRasterizerState(&rs_desc, d3d_rasterizer_state_.GetAddressOf())
);
// デプス・ステンシルステート =============================================
CD3D11_DEPTH_STENCIL_DESC ds_desc(default_state);
DX::ThrowIfFailed(
d3d_device_->CreateDepthStencilState(&ds_desc, d3d_depth_stencil_state_.GetAddressOf())
);
CD3D11_BLEND_DESC bd_desc(default_state);
DX::ThrowIfFailed(
d3d_device_->CreateBlendState(&bd_desc, d3d_blend_state_.GetAddressOf())
);