Closest Hit-Shader

Ein Shader, der aufgerufen wird, wenn er aktiviert ist und der nächste Treffer bestimmt wurde oder die Suche nach Strahlschnitten beendet wurde. Dieser Shader ist der Ort, an dem die Oberflächenschattierung und zusätzliche Strahlgenerierung in der Regel erfolgen. Nächstgelegene Treffer-Shader müssen einen Nutzlastparameter deklarieren, gefolgt von einem Attributparameter. Jeder muss ein benutzerdefinierter Strukturtyp sein, der mit Typen übereinstimmt, die für TraceRay bzw. ReportHit verwendet werden, oder die Struktur der Schnittmengenattribute, wenn die Schnittmenge des Dreiecks mit fester Funktion verwendet wird.

Shadertypattribut

[shader("closesthit")]

Beispiel

[shader("closesthit")]
void closesthit_main(inout MyPayload payload, in MyAttributes attr)
{
    CallShader( ... );  // maybe
    // update payload for surface
    // trace reflection
    float3 worldRayOrigin = WorldRayOrigin() + WorldRayDirection() * RayTCurrent();
    float3 worldNormal = mul(attr.normal, (float3x3)ObjectToWorld3x4());
    RayDesc reflectedRay = { worldRayOrigin, SceneConstants.Epsilon,
                             ReflectRay(WorldRayDirection(), worldNormal),
                             SceneConstants.TMax };
    TraceRay(MyAccelerationStructure,
             SceneConstants.RayFlags,
             SceneConstants.InstanceInclusionMask,
             SceneConstants.RayContributionToHitGroupIndex,
             SceneConstants.MultiplierForGeometryContributionToHitGroupIndex,
             SceneConstants.MissShaderIndex,
             reflectedRay,
             payload);
    // Combine final contributions into ray payload
    // this ray query is now complete.
    // Alternately, could look at data in payload result based on that make other TraceRay
    // calls.  No constraints on the code structure.
}