Bagikan melalui


Shader Persimpangan

Shader yang digunakan untuk mengimplementasikan primitif persimpangan kustom untuk sinar yang berpotongan dengan volume pembatas terkait (kotak pembatas).

Shader persimpangan tidak memiliki akses ke payload sinar, tetapi mendefinisikan atribut persimpangan untuk setiap temuan melalui panggilan ke ReportHit. Penanganan ReportHit dapat menghentikan shader persimpangan lebih awal, jika bendera sinar RAY_FLAG_ACCEPT_FIRST_HIT_\AND_\END_SEARCH diatur, atau AcceptHitAndEndSearch dipanggil dari shader hit apa pun. Jika tidak, itu mengembalikan true jika hit diterima atau salah jika hit ditolak. Ini berarti bahwa shader hit apa pun, jika ada, harus dijalankan sebelum kontrol kembali secara kondisional ke shader persimpangan.

Atribut Jenis Shader

[shader("intersection")]

Contoh

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