Partager via


Nuanceur de correspondance le plus proche

Nuanceur appelé lorsqu’il est activé et que l’accès le plus proche a été déterminé ou que la recherche d’intersection de rayons a été terminée. Ce nuanceur est l’endroit où l’ombrage de surface et la génération de rayons supplémentaires se produisent généralement. Les nuanceurs de correspondance les plus proches doivent déclarer un paramètre de charge utile, suivi d’un paramètre d’attributs. Chacun doit être un type de structure défini par l’utilisateur correspondant aux types utilisés respectivement pour TraceRay et ReportHit , ou la structure d’attributs d’intersection lorsque l’intersection de triangle à fonction fixe est utilisée.

Attribut Type de nuanceur

[shader("closesthit")]

Exemple

[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.
}