ゲーム中固定で使用されるリソースの作成 - 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_; }
};

参考:DirectX11シェーダー入門

シェーダーオブジェクトの作成

シェーダーオブジェクトを作成します。

// 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())
);
⚠️ **GitHub.com Fallback** ⚠️