Tout nuanceur de correspondance

Un nuanceur qui est appelé quand les intersections de rayon ne sont pas opaques.

Les nuanceurs d’accès doivent déclarer un paramètre de charge utile suivi d’un paramètre d’attributs. Chacun de ces paramètres doit être un type de structure défini par l’utilisateur correspondant aux types utilisés pour TraceRay et ReportHit respectivement, ou la structure d’attributs d’intersection quand l’intersection de triangle de fonction fixe est utilisée.

Les nuanceurs d’accès peuvent effectuer les types d’opérations suivants :

  • Lire et modifier la charge utile Ray : (INOUT payload_t rayPayload)
  • Lire les attributs d’intersection : (dans attr_t attributs)
  • Appelez AcceptHitAndEndSearch, qui accepte l’accès actuel, met fin au nuanceur de correspondance, termine le nuanceur d’intersection s’il y en a un, puis exécute le nuanceur de correspondance le plus proche sur le point le plus proche, jusqu’à présent, s’il est actif.
  • Appelez IgnoreHit, qui met fin au nuanceur de correspondance et indique au système de continuer à rechercher les résultats, y compris le renvoi du contrôle à un nuanceur d’intersection, s’il est en cours d’exécution, en renvoyant false à partir du site d’appel ReportHit*.
  • Retourne sans appeler l’une de ces fonctions intrinsèques, qui accepte l’accès actuel et indique au système de continuer à rechercher les correspondances, y compris le retour du contrôle au nuanceur d’intersection le cas échéant, en retournant la valeur true sur le site d’appel ReportHit pour indiquer que l’accès a été accepté.

Même si un appel de nuanceur atteint se termine par IgnoreHit ou AcceptHitAndEndSearch, toutes les modifications apportées à la charge utile de rayon jusqu’à présent doivent toujours être conservées.

Attribut de type Shader

[shader("anyhit")]

Exemple

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