Any Hit-Shader
Ein Shader, der aufgerufen wird, wenn Strahlüberschneidungen nicht undurchsichtig sind.
Alle Treffer-Shader müssen einen Nutzlastparameter gefolgt von einem Attribute-Parameter deklarieren. Jeder dieser Parameter muss ein benutzerdefinierter Strukturtypabgleichstyp sein, der für TraceRay bzw . ReportHit verwendet wird, oder die Schnittpunktattributestruktur , wenn eine feste Funktionsdreieckkreuzung verwendet wird.
Alle Treffer-Shader können die folgenden Arten von Vorgängen ausführen:
- Lesen und Ändern der Raynutzlast: (inout payload_t rayPayload)
- Lesen der Schnittmengenattribute: (in attr_t Attributen)
- Rufen Sie AcceptHitAndEndSearch auf, die den aktuellen Treffer akzeptiert, den beliebigen Treffer-Shader beendet, den Überschneidungsshader beendet, wenn einer vorhanden ist, und führt den nächstgelegenen Treffer-Shader beim bisher nächstgelegenen Treffer aus, wenn er aktiv ist.
- Rufen Sie IgnoreHit auf, der den beliebigen Treffer-Shader beendet und das System angibt, die Suche nach Treffern fortzusetzen, einschließlich der Rückgabe des Steuerelements an einen Schnittpunktshader, wenn es gerade ausgeführt wird, und false von der ReportHit*-Aufrufwebsite zurückgibt.
- Kehren Sie zurück, ohne einen dieser systeminternen Elemente aufzurufen, der den aktuellen Treffer akzeptiert und das System anfordert, die Suche nach Treffern fortzusetzen, einschließlich der Rückgabe des Steuerelements an den Kreuzungsshader, falls vorhanden, und zurückgeben sie true auf der ReportHit-Aufrufwebsite , um anzugeben, dass der Treffer akzeptiert wurde.
Auch wenn ein Beliebiger Hit-Shaderaufruf durch IgnoreHit oder AcceptHitAndEndSearch beendet wird, müssen alle änderungen, die bisher an der Raynutzlast vorgenommen wurden, weiterhin beibehalten werden.
Shadertyp-Attribut
[shader("anyhit")]
Beispiel
[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
}