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