Sombreador del acierto más cercano
Se ha determinado un sombreador que se invoca cuando está habilitado y finaliza la búsqueda de intersección de rayos más cercana. Este sombreador es donde normalmente se producirán sombreado de superficie y generación de rayos adicionales. Los sombreadores de aciertos más cercanos deben declarar un parámetro de carga, seguido de un parámetro de atributos. Cada uno debe ser un tipo de estructura definido por el usuario que coincida con los tipos usados para TraceRay y ReportHit respectivamente, o bien la estructura de atributos de intersección cuando se usa la intersección de triángulos de función fija.
Atributo Tipo de sombreador
[shader("closesthit")]
Ejemplo
[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.
}