コードスペランカー

ゲーム開発日誌など

HLSL入門

基礎的なところから・・・

technique MyTechnique
{
	pass MyPass
	{
		//ここに利用するパスを書く
	}
}

まずはテクニックの定義。
おおさっぱに言うと、こんなことするぞっていう定義になるだろうか?
techniqueの中にあるpassっていうのが、具体的な手段の塊を定義した部分になるだろうか?
まぁ、複数の手段をまとめて1つのテクニックとして定義してるらしい。

technique MyTechnique
{
	pass MyPass
	{
		//ここに利用するパスを書く
		VertexShader = compile vs_2_0 MyVertexShader();
		PixelShader = compile ps_2_0 MyPixelShader();
	}
}

シェーダーは大きく分けて頂点シェーダとピクセルシェーダの2つになり
passの中にはそれぞれどのシェーダを使うかと、コンパイルの方法を定義している。
「compile vs_2_0」というところが「頂点シェーダ2.0でコンパイルしてね」って意味になっているようだ。

float4 MyVertexShader(float4 position : POSITION) : POSITION
{
	return position;
}

で頂点シェーダ部分
頂点シェーダは頂点情報についてああだこうだと命令する場所で、座標変換なんかはここで行う。
「float4」はfloat型が1×4の形になった行列を表してる。「: POSITION」の部分は「float4」が座標を表してることを宣言している。
この命令では、もらったpositionをそのまま返している。

float4 MyPixelShader() : COLOR
{
	return float4(1, 1, 1, 1);
}

ピクセルシェーダ部分
ピクセルシェーダは、頂点データの結果をうけて各ビクセル部分をどう描画するかを命令できる。
「: COLOR」はこれが色のデータであることを定義している。
色データはRGBAで表されてて、それぞれ0〜1で表現される。
HLSLでは、数値は座標も色も0〜1で表現されているようなので注意。
ここでは、頂点の中身を不透明な白で塗るように指示している。

float4 MyVertexShader(float4 position : POSITION) : POSITION
{
	return position;
}

float4 MyPixelShader() : COLOR
{
	return float4(1, 1, 1, 1);
}

technique MyTechnique
{
	pass MyPass
	{
		VertexShader = compile vs_2_0 MyVertexShader();
		PixelShader = compile ps_2_0 MyPixelShader();
	}
}

全体を通してみるとこんな感じになる。
このテクニックを呼ぶときは、

Effect effect = Content.Load<Effect>("foge");

という具合にEffectとしてXNAの中では使える。
あとは、BasicEffectを使って描画するのと同じよううに描画できる。まぁ今回のテクニックでは座標変換を行っていないので当然ながらWorldやらViewやらProjectionは指定できない。そもそもEffectクラスそのものにはそんなプロパティはないので、やるとしたら、自分で付け足さないといけないわけだ。
じゃ、どうやったら座標変換できるようになるかって話はまた今度、まとめようと思う。