bagaimana cara kerja HDR?

17

Saya mencoba memahami apa itu HDR dan bagaimana cara kerjanya.

Saya memahami konsep dasar dan memiliki sedikit gagasan tentang bagaimana ini diterapkan dengan D3D / hlsl.

Namun itu masih cukup berkabut.

Katakanlah saya sedang membuat bola dengan tekstur bumi dan daftar titik kecil simpul untuk bertindak sebagai bintang, bagaimana saya akan membuat ini dalam HDR?

Berikut adalah beberapa hal yang membuat saya bingung:

  • Saya menduga, saya tidak bisa menggunakan sembarang format gambar dasar untuk tekstur karena nilainya akan terbatas pada [0, 255] dan dijepit ke [0, 1] dalam shader. Sama berlaku untuk back buffer, saya bawa format perlu format float point?

  • Apa langkah-langkah lain yang terlibat? Tentunya harus ada lebih dari sekedar menggunakan format floating point untuk membuat target render dan kemudian menerapkan beberapa mekar sebagai proses posting? (mengingat output akan tetap 8bpp)

Pada dasarnya, apa langkah-langkah untuk HDR? Bagaimana cara kerjanya ? Sepertinya saya tidak dapat menemukan makalah / artikel bagus yang menggambarkan prosesnya, selain yang ini , tetapi tampaknya sedikit membaca dasar-dasarnya, jadi membingungkan.

dotminik
sumber

Jawaban:

19

Teknik HDR memungkinkan Anda untuk mensimulasikan rentang detail yang lebih besar daripada yang dapat Anda lihat di layar dibandingkan dengan pencahayaan / tekstur tradisional. Anda dapat membandingkannya dengan bagaimana mata berperilaku ketika terkena jumlah cahaya yang berbeda - ketika ada terlalu banyak cahaya mata membiarkan sedikit cahaya masuk sehingga hal-hal masih dalam kisaran yang terlihat. Ketika tidak ada cukup cahaya, iris terbuka lebih banyak sehingga lebih banyak detail dapat dilihat.

bit-tech.net HDR perbandingan

Sisi kanan gambar ini menggunakan HDR. Itu membuat lebih banyak menggunakan berbagai warna, gelap lebih gelap dan daerah terang lebih cerah. Sebagai perbandingan, sisi kiri gambar terlihat agak datar.

Langkah-langkah dasarnya adalah:

  1. Jadikan adegan Anda menjadi tekstur titik apung (dengan format seperti A16B16G16R16F) menggunakan tekstur titik apung lainnya pada model Anda, dan / atau lampu yang mungkin memiliki kecerahan lebih dari 1.0f.

  2. Untuk menampilkan tekstur ini, rentang warna yang terlihat perlu dikonversi menjadi sesuatu yang dapat ditampilkan di layar Anda - proses ini disebut pemetaan nada , dan berbagai persamaan pemetaan nada yang berbeda dapat digunakan untuk mendapatkan efek yang berbeda. Ini adalah suatu keharusan karena monitor tidak dapat menampilkan rentang penuh warna atau pendaran yang dapat kita simpan dalam tekstur titik mengambang (akan keren jika memungkinkan, tetapi juga akan menjadi bahaya yang menyilaukan ...).

  3. Bloom dan efek setelah lainnya ditambahkan untuk semakin membesar-besarkan perbedaan dalam pendaran dari hal-hal yang diberikan. Mekar dihitung dari buffer titik mengambang dan dikombinasikan dengan gambar yang dipetakan dengan nada.

Semoga itu bisa membantu

CiscoIPPhone
sumber
Saya tahu ini adalah pertanyaan lama (sangat), tetapi bisakah Anda merujuk saya ke algoritma pemetaan nada yang bagus tapi sederhana?
JSQuareD
6

Secara teknis, HDR hanya berarti menggunakan rentang kemungkinan nilai yang lebih besar untuk grafik Anda. Biasanya Anda dibatasi hingga 256 nilai diskrit untuk saluran merah, hijau, dan biru, yang berarti bahwa jika Anda memiliki 2 item, satu dua kali lebih terang dari yang lain, dan ke-3 yang 10.000 kali lebih terang daripada yang pertama, tidak ada cara Anda dapat merepresentasikan ketiga dalam adegan yang sama dengan benar - Anda membuat objek cerah hanya 256x lebih cerah daripada yang pertama, atau Anda membuat kedua objek kusam sepenuhnya hitam (kehilangan kontras di antara mereka) dan kemudian objek cerah menjadi lebih terang lebih jelas dari mereka berdua.

Ini mudah diperbaiki dengan menggunakan nilai floating point untuk nilai merah / hijau / biru - tetapi sekarang Anda memiliki masalah tentang cara menampilkannya pada perangkat grafis yang hanya menangani sejumlah nilai diskrit per saluran (mis. 256) . Jadi bagian kedua dari masalah adalah bagaimana memetakan nilai floating point Anda kembali ke rentang terbatas. Solusi sepele adalah untuk skala semua nilai secara proporsional ke dalam rentang diskrit, tetapi ini berarti bahwa 1 piksel yang sangat cerah dapat membuat seluruh layar menjadi hitam, dll. Kadang-kadang ini yang Anda inginkan, kadang-kadang tidak - lihat pemetaan nada CiscoIPPhone Tautan untuk contoh bagaimana Anda bisa mendekati ini.

Biasanya bukan tekstur Anda yang perlu disimpan dalam format baru - justru saat pencahayaan diterapkan, Anda harus dapat mengakomodasi nilai yang lebih besar. Namun jelas jika Anda memiliki sumber cahaya yang dipanggang menjadi tekstur - misalnya. latar belakang berbintang - Anda mungkin menginginkan format resolusi yang lebih tinggi di sana. Atau cukup shader skala nilai bahan-bahan seperti itu ketika saatnya tiba untuk membuat mereka.

Kylotan
sumber
5

Komputer secara tradisional merepresentasikan setiap piksel pada layar karena hanya 24 bit dalam memori: 8 untuk merah, 8 untuk hijau, dan 8 untuk biru. Ini adalah bit yang hampir tidak dapat dilihat manusia jika Anda menambahkan lebih banyak, dan byte 8-bit sangat nyaman untuk mikroprosesor, jadi itulah yang macet.

Sementara 8 bit hampir presisi cukup untuk menampilkan gambar, itu jelas tidak cukup presisi untuk menghitung gambar. Di berbagai titik saat menghitung gambar, setidaknya diperlukan 32 bit presisi.

Inilah sebabnya mengapa pixel shaders menghitung warna dalam presisi 32-bit, bahkan ketika Anda merender ke gambar presisi 8-bit. Jika tidak, Anda tidak bisa misalnya membagi nilai dengan 1000, dan kemudian kalikan dengan 1000, karena membagi setiap nilai 8-bit dengan 1000 hasil nol.

Telah ada tren dalam grafik 3D waktu nyata untuk menjaga semua gambar dalam ketepatan> 8 bit hingga saat-saat terakhir yang memungkinkan, di mana waktu> 8 bit merah diturunkan menjadi 8 bit, dan seterusnya untuk hijau dan biru.

HDR mengacu pada tindakan rendering pada gambar yang memiliki presisi lebih tinggi dari 8-bit. Dalam videogame TV kontemporer, ketepatan 16-bit adalah norma, dan ini mungkin "cukup" dalam videogame untuk tahun-tahun mendatang.

bmcnett
sumber
2

Salah satu aspek yang saya pikir adalah kunci untuk HDR adalah aplikasi monitor gamma yang benar.

Monitor yang Anda lihat menghasilkan cahaya sebagai fungsi dari piksel input. Anda mungkin berharap bahwa piksel dengan nilai 255 akan menghasilkan (kurang-lebih) 255 kali lebih banyak cahaya daripada piksel dengan nilai 1. Ini bukan masalahnya. Dengan monitor gamma standar 2.3, ini 255 ^ 2.3 kali lebih terang, atau sekitar 340000!

Semua orang yang memproduksi konten (pembuat kamera) mengetahui hal ini, atau (jika Anda seorang desainer) Anda secara implisit mengkompensasinya.

Ini semua baik-baik saja jika Anda hanya membuat bitmap (well, sebagian besar waktu), tetapi jika Anda menggunakannya sebagai tekstur dalam adegan 3D itu adalah cerita yang berbeda. Jika Anda ingin memodelkan interaksi dengan cahaya dengan benar, Anda harus menggunakan perhitungan cahaya linier di sepanjang pipa render. Ini berarti

  • mengoreksi tekstur Anda untuk gamma

  • membuat semuanya dengan cahaya linier (di mana Anda membutuhkan banyak presisi karena Rentang Dinamis Tinggi cahaya),

  • menerapkan transformasi gamma terbalik dari monitor sebagai hal terakhir sebelum Anda meletakkan gambar di layar.

Ketika Anda membuat perubahan ini ke adegan yang sudah ada, dengan karya seni yang ada, lampu, dll, Anda mungkin harus memperbaiki banyak intensitas cahaya dan tekstur Anda, karena mereka dipilih untuk terlihat bagus ketika rendering dengan cahaya non-linear. Jadi ini bukan fitur yang bisa Anda "nyalakan" dan berharap semuanya terlihat lebih baik begitu saja.

jdv-Jan de Vaan
sumber
2
Gamma jelas penting, dan kunci untuk mendapatkan rendering berbasis fisik, tetapi tidak secara langsung ada hubungannya dengan HDR, IMO.
Nathan Reed