Freigeben über


Intersection-Shader

Ein Shader, der verwendet wird, um benutzerdefinierte Schnittmengengrundsätze für Strahlen zu implementieren, die ein zugeordnetes begrenzungsendes Volume (Begrenzungsfeld) überschneiden.

Der Schnittpunkt-Shader hat keinen Zugriff auf die Raynutzlast, definiert aber die Schnittpunktattribute für jeden Treffer über einen Aufruf von ReportHit. Die Behandlung von ReportHit kann den Kreuzungsshader frühzeitig beenden, wenn das Ray-Flag RAY_FLAG_ACCEPT_FIRST_HIT_\AND_\END_SEARCH festgelegt ist oder AcceptHitAndEndSearch von einem beliebigen Treffershader aufgerufen wird. Andernfalls wird true zurückgegeben, wenn der Treffer akzeptiert wurde, oder false, wenn der Treffer abgelehnt wurde. Dies bedeutet, dass ein beliebiger Treffer-Shader ausgeführt werden muss, falls vorhanden, bevor das Steuerelement bedingt zum Schnittpunktshader zurückkehrt.

Shadertyp-Attribut

[shader("intersection")]

Beispiel

struct CustomPrimitiveDef { ... };
struct MyAttributes { ... };
struct CustomIntersectionIterator {...};
void InitCustomIntersectionIterator(CustomIntersectionIterator it) {...}
bool IntersectCustomPrimitiveFrontToBack(
    CustomPrimitiveDef prim,
    inout CustomIntersectionIterator it,
    float3 origin, float3 dir,
    float rayTMin, inout float curT,
    out MyAttributes attr);

[shader("intersection")]
void intersection_main()
{
    float THit = RayTCurrent();
    MyAttributes attr;
    CustomIntersectionIterator it;
    InitCustomIntersectionIterator(it); 
    while(IntersectCustomPrimitiveFrontToBack(
            CustomPrimitiveDefinitions[LocalConstants.PrimitiveIndex],
            it, ObjectRayOrigin(), ObjectRayDirection(), 
            RayTMin(), THit, attr))
    {
        // Exit on the first hit.  Note that if the ray has
        // RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH or an
        // anyhit shader is used and calls AcceptHitAndEndSearch(),
        // that would also fully exit this intersection shader (making
        // the “break” below moot in that case).        
        if (ReportHit(THit, /*hitKind*/ 0, attr) && (RayFlags() &  RAY_FLAG_FORCE_OPAQUE))
            break;
    }
}