Share via


Hit Shader più vicino

Uno shader richiamato quando è abilitato e il colpo più vicino è stato determinato o la ricerca dell'intersezione raggio è stata terminata. Questo shader è la posizione in cui si verificherà in genere l'ombreggiatura della superficie e la generazione di raggi aggiuntivi. I più vicini hit shader devono dichiarare un parametro payload, seguito da un parametro di attributi. Ognuno deve essere un tipo di struttura definito dall'utente che corrisponde ai tipi di corrispondenza usati rispettivamente per TraceRay e ReportHit oppure la struttura degli attributi di intersezione quando viene usata l'intersezione triangolo a funzione fissa.

Attributo Type shader

[shader("closesthit")]

Esempio

[shader("closesthit")]
void closesthit_main(inout MyPayload payload, in MyAttributes attr)
{
    CallShader( ... );	// maybe
    // update payload for surface
    // trace reflection
    float3 worldRayOrigin = WorldRayOrigin() + WorldRayDirection() * RayTCurrent();
    float3 worldNormal = mul(attr.normal, (float3x3)ObjectToWorld3x4());
    RayDesc reflectedRay = { worldRayOrigin, SceneConstants.Epsilon,
                             ReflectRay(WorldRayDirection(), worldNormal),
                             SceneConstants.TMax };
    TraceRay(MyAccelerationStructure,
             SceneConstants.RayFlags,
             SceneConstants.InstanceInclusionMask,
             SceneConstants.RayContributionToHitGroupIndex,
             SceneConstants.MultiplierForGeometryContributionToHitGroupIndex,
             SceneConstants.MissShaderIndex,
             reflectedRay,
             payload);
    // Combine final contributions into ray payload
    // this ray query is now complete.
    // Alternately, could look at data in payload result based on that make other TraceRay
    // calls.  No constraints on the code structure.
}