今回の記事では頂点シェーダとピクセルシェーダをDirectX11で使うまでの実装方法について説明してきます。
DirectX11で使用するシェーダの言語はHLSLです。
今回はこのHLSLのコンパイルも含めてランタイム(実行時)で行う方法について記述します。
前回の記事でも言いましたがDirectX11では固定パイプラインが廃止されました。
なので描画するにはシェーダに実装が必須となります。
では実装について順を追って見ていきましょう。
シェーダのコンパイル
DirectX11で使用するHLSLはGPUの動作を記述するプログラム言語です。
ps.hlsl
// 入力情報
struct PS_INPUT
{
	float4 OutPosition : SV_POSITION;
	float4 Color : COLOR0;
};
void PS(in PS_INPUT In, out float4 Out : SV_Target0)
{
	Out = In.Color;
}
これがHLSLでカラーを出力するだけのピクセルシェーダの実装です。
ただHLSLはテキスト形式なので、そのままではハードウェア側で理解ができません。
動作させるためにはコンパイルして側で理解できるバイナリコードにする必要があります。
では早速コンパイルするための処理を見ていきましょう。
// シェーダコンパイル周りの機能をインクルード
#include <d3dcompiler.h>
// シェーダコンパイル用の静的ライブラリをリンク
#pragma comment(lib, "d3dcompiler.lib")
ID3DBlob* pBlob;
ID3DBlob* pErrorMsg;
HRESULT hr = D3DCompileFromFile(
	"ps.hlsl",
	NULL,
	NULL,
	"PS",
	"ps_5_0",
	0,
	0,
	&pBlob,
	&pErrorMsg
);
if (FAILED(hr))
{
	// シェーダのエラー内容を表示
	MessageBox(NULL, (char*)pErrorMsg->GetBufferPointer(), "Compile Error", MB_OK);
	SafeRelease(pErrorMsg);
}
else
{
	// コンパイル成功
}
シェーダのコンパイルを行うためには下記の2つが必要になります。
- d3dcompiler.hのインクルード
- d3dcompiler.libをリンク
これでピクセルシェーダをコンパイルすることができます。
ps.hlslをピクセルシェーダのシェーダモデル5.0としてコンパイルしています。
コンパイル時にエラーが出た場合はエラーメッセージが pErrorMsg で取得できます。
成功した場合は pBlob にシェーダバイナリが格納されます。
D3DCompileFromFile
| pFileName | コンパイルするHLSLを記述したファイルへのパスを指定します。 | 
|---|---|
| pDefines | HLSL上で事前に定義するdefineを指定できます。 指定しない場合はNULLも可能です。 | 
| pInclude | インクルードファイルを取り扱うためのID3DIncludeを指定できます。 includeを使用しない場合はNULLで問題ありません。D3D_COMPILE_STANDARD_FILE_INCLUDEを指定することで相対パスでのincludeを可能にします。 | 
| pEntrypoint | エントリーポイントとなる関数名を指定します。 | 
| pTarget | コンパイル時のターゲットとなるシェーダモデルを指定します。 | 
| Flags1 | コンパイルオプションを指定できます。 オプション内容については公式のドキュメントを参考にしてください。 | 
| Flags2 | エフェクトファイル用のコンパイルオプションを指定できます。 シェーダをコンパイルする場合は 0 を指定します。 | 
| ppCode | コンパイル結果のバイナリコードが格納されます。 | 
| ppErrorMsgs | コンパイルエラー時にエラー内容が格納されます。 | 
この関数を使用してバイナリコードを生成して使用します。
※プログラム上の文字列から直接コンパイルしたい場合はD3DCOMPILE関数を使用します。