シェーダー ステージ
シェーダーステージ関数にはあらかじめ定められた名前がついているので、変更しないことをお勧めします。
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
メソッドをオーバーライドすることができます。