任意命中着色器

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

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

任何命中着色器都可以执行以下作:

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

即使 Any-hit 着色器调用由 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
}