DirectX11の頂点シェーダとピクセルシェーダ

描画処理

ここまで来れば後はそれぞれのクラスを使って描画するだけです!

初期化から描画、解放までの流れはこんな感じになります。

VertexBuffer vertexBuffer;
VertexShader vertexShader;
PixelShader pixelShader;
InputLayout inputLayout;

// 頂点データ
struct Vertex
{
	float x, y, z;
	UINT color;
};

// シェーダと頂点バッファの初期化
bool Initialize(DirectX11& directX11)
{
	Vertex vertices[] =
	{
		{ -0.5f, -0.5f, 0.0f, 0xffffffff },
		{ -0.5f,  0.5f, 0.0f, 0xffffffff },
		{  0.5f, -0.5f, 0.0f, 0xffffffff },
		{  0.5f,  0.5f, 0.0f, 0xffffffff },
	};
	if (!vertexBuffer.Initialize(directX11, sizeof(vertices), vertices)) return false;
	if (!vertexShader.Initialize(directX11, "Shader.hlsl", "VS")) return false;
	if (!pixelShader.Initialize(directX11, "Shader.hlsl", "PS")) return false;

	// 入力レイアウト
	D3D11_INPUT_ELEMENT_DESC elements[] = {
		{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
		{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 4 * 3, D3D11_INPUT_PER_VERTEX_DATA, 0 },
	};
	UINT numElements = ARRAYSIZE(elements);
	if (!inputLayout.Initialize(directX11, vertexShader, elements, numElements)) return false;

	return true;
}
// 終了処理
void Finalize()
{
	inputLayout.Finalize();
	vertexBuffer.Finalize();
	vertexShader.Finalize();
	pixelShader.Finalize();
}
// 描画
void Render(DirectX11& directX11)
{
	ID3D11DeviceContext* pContext = directX11.GetContext();
	ID3D11RenderTargetView* pTarget = directX11.GetRenderTargetView();
	// ビューポート(描画範囲の設定)
	D3D11_VIEWPORT ViewPort;
	ViewPort.TopLeftX = 0;
	ViewPort.TopLeftY = 0;
	ViewPort.Width = 1280;
	ViewPort.Height = 720;
	ViewPort.MinDepth = 0.0f;
	ViewPort.MaxDepth = 1.0f;
	// 描画するターゲットの設定
	pContext->OMSetRenderTargets(1, &pTarget, NULL);
	pContext->RSSetViewports(1, &ViewPort);
	// 使用するシェーダの設定
	pContext->VSSetShader(vertexShader.GetShader(), NULL, 0);
	pContext->PSSetShader(pixelShader.GetShader(), NULL, 0);
	// 頂点バッファと頂点レイアウトの設定
	UINT offset = 0;
	UINT stride = sizeof(Vertex);
	ID3D11Buffer* pVBuffer = vertexBuffer.GetBuffer();
	pContext->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);
	pContext->IASetInputLayout(inputLayout.GetInputLayout());
	// 描画
	pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
	pContext->Draw(4, 0);
}

これでシェーダを使った描画が行えます。
DirectX11では必ず描画にシェーダが必要となるので少し難易度が高くなっています。
ただ描画できるところまで持っていければあとはシェーダを触ってダイレクトに見た目に影響を与えられるので少しずつ触っていけるようにしましょう!

今後はシェーダを使った様々な演出も記事にしていこうと思います。

1 2 3 4

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です