任何命中着色器

当光线交集不透明时调用的着色器。

任何命中着色器都必须声明有效负载参数,后跟特性参数。 其中每个参数都必须是分别用于 TraceRayReportHit 的用户定义结构类型匹配类型,或使用固定函数三角形交集时交 集属性结构

任何命中着色器都可执行以下类型的操作:

  • 读取和修改光线有效负载: (payload_t rayPayload)
  • 读取交集属性:attr_t属性中的 ()
  • 调用 AcceptHitAndEndSearch(接受当前命中)结束 任何命中着色器,如果存在,则结束 交集着色器 ,并在最接近的命中执行 最近的命中着色器 (如果活动)。
  • 调用 IgnoreHit(结束任何命中着色器并告知系统继续搜索命中),包括将控件返回到交集着色器(如果当前正在执行),则从 ReportHit* 调用站点返回 false。
  • 返回时不调用其中任一内部函数,该内部函数接受当前命中,并告知系统继续搜索命中,包括返回对交集着色器的控制(如果有),在 ReportHit 调用站点返回 true 以指示已接受命中。

即使 IgnoreHitAcceptHitAndEndSearch 终止了任何命中着色器调用,到目前为止对光线有效负载所做的任何修改仍必须保留。

着色器类型属性

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