Condividi tramite


Shader intersezione

Shader utilizzato per implementare primitive di intersezione personalizzate per i raggi che intersecano un volume di delimitazione associato (rettangolo di selezione).

Lo shader di intersezione non ha accesso al payload ray, ma definisce gli attributi di intersezione per ogni hit tramite una chiamata a ReportHit. La gestione di ReportHit può arrestare anticipatamente lo shader di intersezione, se il flag ray RAY_FLAG_ACCEPT_FIRST_HIT_\AND_\END_SEARCH è impostato oppure AcceptHitAndEndSearch viene chiamato da un hit shader. In caso contrario, restituisce true se l'hit è stato accettato o false se l'hit è stato rifiutato. Ciò significa che qualsiasi hit shader, se presente, deve essere eseguito prima che il controllo torni in modo condizionale allo shader di intersezione.

Attributo Tipo shader

[shader("intersection")]

Esempio

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