Compartilhar via


Sombreador de todos os cliques

Um sombreador que é invocado quando as interseções de raios não são opacas.

Qualquer sombreador de ocorrência deve declarar um parâmetro de carga seguido por um parâmetro de atributos. Cada um desses parâmetros 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.

Qualquer sombreadores de ocorrência pode executar os seguintes tipos de operações:

  • Ler e modificar o conteúdo do raio: (inout payload_t rayPayload)
  • Ler os atributos de interseção: (em atributos attr_t)
  • Chame AcceptHitAndEndSearch, que aceita a ocorrência atual, encerra o sombreador de qualquer ocorrência, termina o sombreador de interseção se houver um e executa o sombreador de ocorrência mais próximo na ocorrência mais próxima até agora se ele estiver ativo.
  • Chame IgnoreHit, que encerra o sombreador de qualquer ocorrência e instrui o sistema a continuar procurando ocorrências, incluindo o retorno do controle para um sombreador de interseção, se ele estiver em execução no momento, retornando false do site de chamada ReportHit*.
  • Retorne sem chamar nenhum desses intrínsecos, que aceita a ocorrência atual e instrui o sistema a continuar procurando ocorrências, incluindo retornar o controle para o sombreador de interseção se houver um, retornando true no site de chamada ReportHit para indicar que a ocorrência foi aceita.

Mesmo que uma invocação de sombreador de ocorrência seja encerrada por IgnoreHit ou AcceptHitAndEndSearch, todas as modificações feitas no conteúdo do raio até agora ainda deverão ser mantidas.

Atributo De tipo de sombreador

[shader("anyhit")]

Exemplo

[shader("anyhit")]
void anyhit_main( inout MyPayload payload, in MyAttributes attr )
{
    float3 hitLocation = ObjectRayOrigin() + ObjectRayDirection() * RayTCurrent();
    float alpha = computeAlpha(hitLocation, attr, ...);

    // Processing shadow and only care if a hit is registered?
    if (TerminateShadowRay(alpha))
        AcceptHitAndEndSearch(); // aborts function

    // Save alpha contribution and ignoring hit?
    if (SaveAndIgnore(payload, RayTCurrent(), alpha, attr, ...))
        IgnoreHit(); // aborts function

    // do something else
    // return to accept and update closest hit
}