Condividi tramite


Qualsiasi hit shader

Shader richiamato quando gli intersezioni dei raggi non sono opache.

Qualsiasi hit shader deve dichiarare un parametro payload seguito da un parametro di attributi. Ognuno di questi parametri deve essere un tipo di struttura definito dall'utente che corrisponde rispettivamente ai tipi di corrispondenza di TraceRay e ReportHit oppure alla struttura attributi di intersezione quando viene usata l'intersezione del triangolo della funzione fissa.

Qualsiasi hit shader può eseguire i tipi di operazioni seguenti:

  • Leggere e modificare il payload del raggio: (inout payload_t rayPayload)
  • Leggere gli attributi di intersezione: (in attr_t attributi)
  • Chiamare AcceptHitAndEndSearch, che accetta l'hit corrente, termina l'eventuale hit shader, termina lo shader di intersezione se presente ed esegue lo shader più vicino al colpo più vicino finora se è attivo.
  • Chiama IgnoreHit, che termina l'hit shader e indica al sistema di continuare a cercare i riscontri, incluso il controllo restituito a uno shader di intersezione, se è attualmente in esecuzione, restituendo false dal sito di chiamata ReportHit*.
  • Restituisce senza chiamare uno di questi intrinseci, che accetta l'hit corrente e indica al sistema di continuare la ricerca di colpi, incluso il ritorno al controllo di intersezione se ne esiste uno, restituendo true nel sito di chiamata ReportHit per indicare che l'hit è stato accettato.

Anche se una chiamata a hit shader viene terminata da IgnoreHit o AcceptHitAndEndSearch, tutte le modifiche apportate al payload del raggio devono comunque essere mantenute.

Attributo Type shader

[shader("anyhit")]

Esempio

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