任何命中着色器

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

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

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

  • 读取和修改光线有效负载: (inout 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
}