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.
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.
sumber
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.
sumber
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.
sumber