Table of Contents

シェーダー ステージ

シェーダーステージ関数にはあらかじめ定められた名前がついているので、変更しないことをお勧めします。

  • HSMain:ハルシェーダー
  • HSConstantMain: パッチ定数関数
  • DSMain:ドメインシェーダー
  • VSMain:頂点シェーダー(引数はありません)
  • GSMain:ジオメトリシェーダー
  • PSMain:ピクセルシェーダー(引数はありません)
  • CSMain:コンピュートシェーダー(引数はありません)

これらの関数の型はすべて void です。

ジオメトリシェーダーとテッセレーションシェーダーは、入力と出力のために、何らかの構造体を定義する必要があります。しかし、Stride のシェーダーは一般的なものなので、どのような構造になるかを事前に知ることはできません。そのため、これらのシェーダーでは、最終的なシェーダーに合わせて自動的に生成される Input 構造体と Output 構造体を使います。

頂点シェーダー

頂点シェーダーは、SV_Position セマンティックを使って変数を設定します。 ShaderBase では、ShadingPosition がそれに当たります。

例:

override stage void VSMain()
{
	...
	streams.ShadingPosition = ...;
	...
}

ピクセルシェーダー

ピクセルシェーダーは、SV_Target セマンティックを使って変数を設定します。 ShaderBase では、ColorTarget がそれに当たります。

例:

override stage void PSMain()
{
	...
	streams.ColorTarget = ...;
	...
}

ジオメトリシェーダー

ジオメトリシェーダーの例:

[maxvertexcount(1)]
void GSMain(triangle Input input[3], inout PointStream<Output> pointStream)
{
	...
	// ストリームオブジェクトを充填します。
	// fill the streams object
	streams = input[0];
 	...
 
	// 常に ストリームを追加します。
	// always append streams
	pointStream.Append(streams);
	...
}

Input はメソッド本体で使うことができます。これはストリームオブジェクトと同じように動作し、同じメンバーを持っています。

Output はメソッドの宣言でのみ使うことができます。ストリームオブジェクトをジオメトリシェーダーの出力ストリームに追加する必要があります。

テッセレーションシェーダー

テッセレーションシェーダーの例:

[domain("tri")]
[partitioning("fractional_odd")]
[outputtopology("triangle_cw")]
[outputcontrolpoints(3)]
[patchconstantfunc("HSConstantMain")]
[maxtessfactor(48.0)]
void HSMain(InputPatch<Input, 3> input, out Output output, uint uCPID : SV_OutputControlPointID)
{
	...
	output = streams;
}
 
void HSConstantMain(InputPatch<Input, 3> input, const OutputPatch<Input2, 3> output, out Constants constants)
{
	...
	output = streams;
	...
}
 
[domain("tri")]
void DSMain(const OutputPatch<Input, 3> input, out Output output, in Constants constants, float3 f3BarycentricCoords : SV_DomainLocation)
{
	...
	output = streams;
	...
}

InputInput2 はどちらも、ストリームのように振る舞います。

Note

ステージの最後で、outputstreams に割り当てることを忘れないでください。

コンピュートシェーダー

コンピュートシェーダーの例:

[numthreads(2, 3, 5)]
void CSMain()
{
	...
}

ComputeShaderBase を継承して、Compute メソッドをオーバーライドすることができます。

関連項目