Compartir a través de


Sombreador de cualquier acierto

Sombreador que se invoca cuando las intersecciones de rayos no son opacos.

Los sombreadores de aciertos deben declarar un parámetro de carga seguido de un parámetro de atributos. Cada uno de estos parámetros debe ser un tipo de estructura definido por el usuario que coincida con los tipos usados para TraceRay y ReportHit , respectivamente, o la estructura de atributos de intersección cuando se usa la intersección de triángulos de función fija.

Los sombreadores de aciertos pueden realizar los siguientes tipos de operaciones:

  • Leer y modificar la carga del rayo: (inout payload_t rayPayload)
  • Lea los atributos de intersección: (en attr_t atributos)
  • Llame a AcceptHitAndEndSearch, que acepta el acierto actual, finaliza cualquier sombreador de aciertos, finaliza el sombreador de intersección si hay uno presente y ejecuta el sombreador de aciertos más cercano hasta el momento si está activo.
  • Llame a IgnoreHit, que finaliza el sombreador de aciertos e indica al sistema que siga buscando visitas, incluida la devolución del control a un sombreador de intersección, si se está ejecutando actualmente, devolviendo false desde el sitio de llamada ReportHit*.
  • Devuelve sin llamar a ninguno de estos intrínsecos, que acepta el acierto actual e indica al sistema que continúe buscando aciertos, incluido devolver el control al sombreador de intersección si hay alguno, devolviendo true en el sitio de llamada reportHit para indicar que se aceptó el acierto.

Incluso si una invocación de sombreador de posicionamiento finaliza por IgnoreHit o AcceptHitAndEndSearch, las modificaciones realizadas en la carga del rayo hasta ahora deben conservarse.

Atributo Tipo de sombreador

[shader("anyhit")]

Ejemplo

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