Поделиться через


Шейдер любого попадания

Шейдер, который вызывается, когда пересечения лучей непрозрачны.

Шейдер любого попадания должен объявить параметр полезных данных, за которым следует параметр атрибутов. При использовании пересечения с фиксированным треугольником функций каждая из этих параметров должна быть определяемым пользователем типом структуры, соответствующими типам, используемым для TraceRay и ReportHit соответственно, или структурой атрибутов пересечения.

Шейдер любого попадания может выполнять следующие виды операций:

  • Чтение и изменение полезных данных луча: (inout payload_t rayPayload).
  • Чтение атрибутов пересечения: (в attr_t атрибутах).
  • Вызов AcceptHitAndEndSearch, который принимает текущее попадание, заканчивает любой хит шейдер, заканчивает шейдер пересечения , если он присутствует, и выполняет ближайший шейдер попадания на ближайший хит до сих пор, если он активен.
  • Вызов IgnoreHit, который заканчивает текущий шейдер любого попадания, и сообщает системе продолжить поиск попаданий, включая возврат управления в шейдер пересечения, если он в настоящее время выполняется, и возвращает false из сайта вызова ReportHit*.
  • Возвращается без вызова любой из этих встроенных функций, который принимает текущее попадание и сообщает системе продолжать поиск попаданий, включая возврат управления в шейдер пересечения, если есть один, и возвращает значение true на сайте вызова ReportHit , чтобы указать, что хит был принят.

Даже если вызов шейдера с любым хитом завершается с помощью IgnoreHit или AcceptHitAndEndSearch, все изменения, внесенные в полезные данные луча, до сих пор должны быть сохранены.

Атрибут типа шейдера

[shader("anyhit")]

Пример

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