任意のヒット シェーダー
レイ交差が不透明でないときに呼び出されるシェーダー。
ヒット シェーダーでは、ペイロード パラメーターとその後に attributes パラメーターを宣言する必要があります。 これらの各パラメーターは、 TraceRay と ReportHit にそれぞれ使用されるユーザー定義の構造体型の一致型、または固定関数の三角形交差を使用する場合は 交差属性構造体 である必要があります。
ヒット シェーダーは、次の種類の操作を実行できます。
- レイ ペイロードの読み取りと変更: (inout payload_t rayPayload)
- 交差属性の読み取り: (attr_t属性内)
- 現在のヒットを受け入れる AcceptHitAndEndSearch を呼び出し、 ヒット シェーダーを終了し、存在する場合は 交差シェーダー を終了し、最 も近いヒット シェーダー がアクティブな場合は、最も近いヒット シェーダーを実行します。
- IgnoreHit を呼び出します。これはヒット シェーダーを終了し、現在実行中の場合は交差点シェーダーに制御を返し、ReportHit* 呼び出しサイトから false を返すなど、ヒットの検索を続行するようにシステムに指示します。
- これらの組み込みのいずれかを呼び出さずに戻ります。これは、現在のヒットを受け入れ、ヒットが存在する場合は交差点シェーダーに制御を返し、ヒットが受け入れられたことを示す ReportHit 呼び出しサイトで true を返すなど、ヒットの検索を続行するようにシステムに指示します。
ヒット シェーダー呼び出しが IgnoreHit または AcceptHitAndEndSearch によって終了した場合でも、これまでにレイ ペイロードに加えられた変更は保持する必要があります。
シェーダーの種類属性
[shader("anyhit")]
例
[shader("anyhit")]
void anyhit_main( inout MyPayload payload, in MyAttributes attr )
{
float3 hitLocation = ObjectRayOrigin() + ObjectRayDirection() * RayTCurrent();
float alpha = computeAlpha(hitLocation, attr, ...);
// Processing shadow and only care if a hit is registered?
if (TerminateShadowRay(alpha))
AcceptHitAndEndSearch(); // aborts function
// Save alpha contribution and ignoring hit?
if (SaveAndIgnore(payload, RayTCurrent(), alpha, attr, ...))
IgnoreHit(); // aborts function
// do something else
// return to accept and update closest hit
}