Compartilhar via


Sombreador do clique mais próximo

Um sombreador que é invocado quando está habilitado e a ocorrência mais próxima foi determinada ou a pesquisa de interseção de raio terminou. Esse sombreador é o local em que o sombreamento da superfície e a geração de raios adicionais normalmente ocorrerão. Os sombreadores de ocorrência mais próximos devem declarar um parâmetro de carga, seguido por um parâmetro de atributos. Cada um deve ser um tipo de estrutura definido pelo usuário que corresponda aos tipos usados para TraceRay e ReportHit , respectivamente, ou a Estrutura de Atributos de Interseção quando a interseção de triângulo de função fixa é usada.

Atributo De tipo de sombreador

[shader("closesthit")]

Exemplo

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