任何命中着色器
当光线交集不透明时调用的着色器。
任何命中着色器都必须声明有效负载参数,后跟特性参数。 其中每个参数都必须是分别用于 TraceRay 和 ReportHit 的用户定义结构类型匹配类型,或使用固定函数三角形交集时交 集属性结构 。
任何命中着色器都可执行以下类型的操作:
- 读取和修改光线有效负载: (payload_t rayPayload)
- 读取交集属性:attr_t属性中的 ()
- 调用 AcceptHitAndEndSearch(接受当前命中)结束 任何命中着色器,如果存在,则结束 交集着色器 ,并在最接近的命中执行 最近的命中着色器 (如果活动)。
- 调用 IgnoreHit(结束任何命中着色器并告知系统继续搜索命中),包括将控件返回到交集着色器(如果当前正在执行),则从 ReportHit* 调用站点返回 false。
- 返回时不调用其中任一内部函数,该内部函数接受当前命中,并告知系统继续搜索命中,包括返回对交集着色器的控制(如果有),在 ReportHit 调用站点返回 true 以指示已接受命中。
即使 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
}