Compartir a través de


Sombreador de intersección

Sombreador que se usa para implementar primitivos de intersección personalizados para los rayos que intersecan un volumen de límite asociado (rectángulo de límite).

El sombreador de intersección no tiene acceso a la carga de rayos, pero define los atributos de intersección para cada acierto a través de una llamada a ReportHit. El control de ReportHit puede detener el sombreador de intersección temprano, si se establece la marca de rayos RAY_FLAG_ACCEPT_FIRST_HIT_\AND_\END_SEARCH , o se llama a AcceptHitAndEndSearch desde un sombreador de aciertos. De lo contrario, devuelve true si se aceptó el acierto o false si se rechazó el acierto. Esto significa que cualquier sombreador de aciertos, si está presente, debe ejecutarse antes de que el control vuelva condicionalmente al sombreador de intersección.

Atributo Tipo de sombreador

[shader("intersection")]

Ejemplo

struct CustomPrimitiveDef { ... };
struct MyAttributes { ... };
struct CustomIntersectionIterator {...};
void InitCustomIntersectionIterator(CustomIntersectionIterator it) {...}
bool IntersectCustomPrimitiveFrontToBack(
    CustomPrimitiveDef prim,
    inout CustomIntersectionIterator it,
    float3 origin, float3 dir,
    float rayTMin, inout float curT,
    out MyAttributes attr);

[shader("intersection")]
void intersection_main()
{
    float THit = RayTCurrent();
    MyAttributes attr;
    CustomIntersectionIterator it;
    InitCustomIntersectionIterator(it); 
    while(IntersectCustomPrimitiveFrontToBack(
            CustomPrimitiveDefinitions[LocalConstants.PrimitiveIndex],
            it, ObjectRayOrigin(), ObjectRayDirection(), 
            RayTMin(), THit, attr))
    {
        // Exit on the first hit.  Note that if the ray has
        // RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH or an
        // anyhit shader is used and calls AcceptHitAndEndSearch(),
        // that would also fully exit this intersection shader (making
        // the “break” below moot in that case).        
        if (ReportHit(THit, /*hitKind*/ 0, attr) && (RayFlags() &  RAY_FLAG_FORCE_OPAQUE))
            break;
    }
}