Partager via


Tout nuanceur de correspondance

Nuanceur appelé lorsque les intersections de rayons ne sont pas opaques.

Tous 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 respectivement pour TraceRay et ReportHit , ou la structure des attributs d’intersection lorsque l’intersection du triangle de fonction fixe est utilisée.

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

  • Lire et modifier la charge utile de rayon : (inout payload_t rayPayload)
  • Lire les attributs d’intersection : (dans les attributs attr_t)
  • Appelez AcceptHitAndEndSearch, qui accepte l’accès en cours, met fin à n’importe quel nuanceur d’accès, met fin au nuanceur d’intersection si l’un d’eux est présent et exécute le nuanceur d’accès le plus proche sur le résultat le plus proche jusqu’à présent s’il est actif.
  • Appelez IgnoreHit, qui met fin à n’importe quel nuanceur d’accès et indique au système de continuer à rechercher des accès, y compris le retour du contrôle à un nuanceur d’intersection, s’il est en cours d’exécution, en retournant false à partir du site d’appel ReportHit*.
  • Retournez sans appeler l’une de ces intrinsèques, ce qui accepte l’accès actuel et indique au système de continuer à rechercher des accès, y compris le retour du contrôle au nuanceur d’intersection s’il y en a un, en retournant true sur le site d’appel ReportHit pour indiquer que l’accès a été accepté.

Même si un appel de nuanceur d’accès est terminé par IgnoreHit ou AcceptHitAndEndSearch, toutes les modifications apportées à la charge utile du rayon à ce jour doivent toujours être conservées.

Attribut Type de nuanceur

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