シェーダー ステージ
シェーダーステージ関数にはあらかじめ定められた名前がついているので、変更しないことをお勧めします。
- 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;
	...
}
Input と Input2 はどちらも、ストリームのように振る舞います。
Note
ステージの最後で、output を streams に割り当てることを忘れないでください。
コンピュートシェーダー
コンピュートシェーダーの例:
[numthreads(2, 3, 5)]
void CSMain()
{
	...
}
ComputeShaderBase を継承して、Compute メソッドをオーバーライドすることができます。