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


Шейдер любых попаданий

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

Все шейдеры попадания должны объявлять параметр полезных данных, за которым следует параметр атрибутов. Каждый из этих параметров должен быть определяемым пользователем типом структуры, соответствующим типам , используемым для 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
}