次の方法で共有


任意のヒット シェーダー

レイ交差が不透明でないときに呼び出されるシェーダー。

ヒット シェーダーでは、ペイロード パラメーターとその後に attributes パラメーターを宣言する必要があります。 これらの各パラメーターは、 TraceRayReportHit にそれぞれ使用されるユーザー定義の構造体型の一致型、または固定関数の三角形交差を使用する場合は 交差属性構造体 である必要があります。

ヒット シェーダーは、次の種類の操作を実行できます。

  • レイ ペイロードの読み取りと変更: (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
}