次の方法で共有


積集合シェーダー

関連付けられた境界ボリューム (境界ボックス) と交差するレイのカスタム交差プリミティブを実装するために使用されるシェーダー。

交差シェーダーはレイ ペイロードにアクセスできませんが、 ReportHit の呼び出しを通じて各ヒットの交差属性を定義します。 ReportHit の処理は、レイ フラグ RAY_FLAG_ACCEPT_FIRST_HIT_\AND_\END_SEARCHが設定されている場合、または AcceptHitAndEndSearch がヒット シェーダーから呼び出された場合に、交差シェーダーを早期に停止することがあります。 それ以外の場合は、ヒットが受け入れられた場合は true、ヒットが拒否された場合は false を返します。 つまり、ヒット シェーダーが存在する場合は、コントロールが条件付きで交差シェーダーに戻る前に実行する必要があります。

シェーダーの種類属性

[shader("intersection")]

struct CustomPrimitiveDef { ... };
struct MyAttributes { ... };
struct CustomIntersectionIterator {...};
void InitCustomIntersectionIterator(CustomIntersectionIterator it) {...}
bool IntersectCustomPrimitiveFrontToBack(
    CustomPrimitiveDef prim,
    inout CustomIntersectionIterator it,
    float3 origin, float3 dir,
    float rayTMin, inout float curT,
    out MyAttributes attr);

[shader("intersection")]
void intersection_main()
{
    float THit = RayTCurrent();
    MyAttributes attr;
    CustomIntersectionIterator it;
    InitCustomIntersectionIterator(it); 
    while(IntersectCustomPrimitiveFrontToBack(
            CustomPrimitiveDefinitions[LocalConstants.PrimitiveIndex],
            it, ObjectRayOrigin(), ObjectRayDirection(), 
            RayTMin(), THit, attr))
    {
        // Exit on the first hit.  Note that if the ray has
        // RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH or an
        // anyhit shader is used and calls AcceptHitAndEndSearch(),
        // that would also fully exit this intersection shader (making
        // the “break” below moot in that case).        
        if (ReportHit(THit, /*hitKind*/ 0, attr) && (RayFlags() &  RAY_FLAG_FORCE_OPAQUE))
            break;
    }
}