Bagikan melalui


Setiap Hit Shader

Shader yang dipanggil ketika persimpangan sinar tidak buram.

Setiap shader hit harus mendeklarasikan parameter payload diikuti dengan parameter atribut. Masing-masing parameter ini harus merupakan jenis pencocokan jenis struktur yang ditentukan pengguna yang digunakan untuk TraceRay dan ReportHit masing-masing, atau Struktur Atribut Persimpangan saat persimpangan segitiga fungsi tetap digunakan.

Setiap shader hit dapat melakukan jenis operasi berikut:

  • Membaca dan memodifikasi payload sinar: (masuk payload_t rayPayload)
  • Baca atribut persimpangan: (dalam atribut attr_t)
  • Panggil AcceptHitAndEndSearch, yang menerima hit saat ini, mengakhiri shader hit apa pun, mengakhiri shader persimpangan jika ada, dan menjalankan shader hit terdekat pada hit terdekat sejauh ini jika aktif.
  • Panggil IgnoreHit, yang mengakhiri shader hit apa pun dan memberi tahu sistem untuk terus mencari temuan, termasuk mengembalikan kontrol ke shader persimpangan, jika saat ini dijalankan, mengembalikan false dari situs panggilan ReportHit*.
  • Kembali tanpa memanggil salah satu intrinsik ini, yang menerima hit saat ini dan memberi tahu sistem untuk terus mencari temuan, termasuk mengembalikan kontrol ke shader persimpangan jika ada, mengembalikan true di situs panggilan ReportHit untuk menunjukkan bahwa hit diterima.

Bahkan jika pemanggilan shader hit berakhir oleh IgnoreHit atau AcceptHitAndEndSearch, modifikasi apa pun yang dilakukan pada payload sinar sejauh ini harus tetap dipertahankan.

Atribut Jenis Shader

[shader("anyhit")]

Contoh

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