任何命中着色器
在光线交集不透明时调用的着色器。
任何命中着色器都必须声明一个有效负载参数,后跟一个 attributes 参数。 其中每个参数都必须是用户定义的结构类型匹配类型,分别用于 TraceRay 和 ReportHit ,或使用固定函数三角形交集时的 交集属性结构 。
任何命中着色器都可能执行以下类型的操作:
- 读取和修改光线有效负载: (inout 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
}