Saya melihat fungsi ddx
dan ddy
glsl dan persamaan hlsl muncul dalam kode shader setiap saat. Saat ini saya menggunakan mereka untuk melakukan pemetaan benjolan tanpa garis singgung atau bitangent tapi pada dasarnya saya salin-tempel kode. Saya tidak mengerti apa sebenarnya fungsi-fungsi ini, apa yang mereka lakukan, dan kapan saya akan menggunakannya.
Jadi pertanyaan:
- Apa fungsi turunan screenspace?
- Apa fungsi ini lakukan? Nilai input dan nilai output
- Efek apa yang paling sering mereka gunakan?
- Apa jenis efek yang mengharuskan Anda melihat ke fungsi ini?
Jawaban:
Pertama, perlu diketahui bahwa GPU selalu mengevaluasi shader fragmen / piksel pada 2x2 blok piksel sekaligus. (Bahkan jika hanya beberapa dari piksel tersebut yang perlu digambar, sementara yang lain berada di luar poligon atau tersumbat - fragmen yang tidak dibutuhkan disembunyikan alih-alih ditulis pada akhirnya).
Turunan screenspace dari variabel (atau ekspresi)
v
di shader Anda adalah perbedaan dalam nilaiv
(pada saat itu dalam kode) dari satu sisi quad 2x2 pixel ini ke yang lain. yaitu.ddx
adalah nilaiv
dalam piksel kanan minus nilaiv
di kiri, dan juga untukddy
di vertikal.Ini menjawab "seberapa cepat
v
kenaikan atau penurunan saat kita bergerak secara horizontal (ddx) atau vertikal (ddy) di layar?" - yaitu. dalam istilah kalkulus, ia mendekati turunan parsial dari variabel Anda (perkiraan karena menggunakan sampel diskrit di setiap fragmen, daripada secara matematis mengevaluasi perilaku sangat kecil dari fungsi)Untuk jumlah skalar, kita juga bisa melihat ini sebagai vektor gradien
∇v = float2(ddx(v), ddy(v))
yang menunjuk sepanjang arah ruang layar yangv
meningkat paling cepat.Jenis informasi ini sering digunakan secara internal untuk memilih mipmap atau kernel filtering anisotrop yang sesuai untuk pencarian tekstur. Sebagai contoh, jika kamera saya terlihat hampir sejajar dengan
uv
arah vertikal bidang lantai yang bertekstur,ddy(uv.y)
akan sangat besar dibandingkan denganddx(uv.x)
(karena sumbu vertikal diperhitungkan pada layar - satu piksel melangkah secara vertikal mencakup bentangan ruang tekstur yang lebih panjang), yang memberitahu perangkat keras pengambilan sampel tekstur bahwa saya perlu penyaringan anisotropik untuk mengaburkan arah tekstur vertikal lebih dari horizontal untuk menghindari artefak alias.Untuk efek paling sederhana, Anda tidak perlu menggunakan turunan ini, karena metode pengambilan sampel tekstur 2D dasar menanganinya untuk Anda. Tetapi seperti yang dikatakan Le Comte du Merde-fou dalam komentar di atas, saat Anda mendistorsi pencarian tekstur, Anda mungkin perlu mengambil dan / atau memijat turunan screenspace secara manual untuk digunakan, untuk membantu perangkat keras memilih pemfilteran yang sesuai (mis. Via
tex2Dlod
dalam HLSL)Wallpaper screenspace adalah salah satu contohnya, di mana satu blok 2x2 dapat mencakup diskontinyuitas lompatan besar dalam koordinat tekstur yang dihitung, yang mengarah ke tepi yang diolesi atau alias jika Anda membiarkan sistem menghitung level filter secara naif. Artikel ini menjelaskan secara terperinci tentang artefak ini dan pendekatan untuk menguranginya .
Derivatif ini juga berguna ketika Anda menggunakan fungsi noise dalam pembuatan tekstur prosedural. Jika, katakanlah, Anda ingin mengubah suara prosedural menjadi peta normal, ddx & ddy berikan cara sederhana, jika kurang-lebih, untuk menghitung bagaimana nilai kebisingan berubah di sekitar fragmen saat ini, dan ke arah mana kemiringannya, sehingga Anda dapat membangun normal yang sesuai.
Teknik rendering garis antialiased atau highlight persimpangan mungkin juga menggunakan turunan screenspace, untuk memastikan ketebalan / falloff konsisten dan tidak tergantung pada geometri atau sudut tampilan.
Dalam pembicaraan tentang rendering pasir di Journey , pembicara menyebutkan mereka bisa menggunakan fungsi turunan ini untuk mengontrol seberapa gemerlapnya pasir di sepanjang sudut pandang ... jika mereka tahu tentang mereka pada saat itu (sebagai gantinya mereka menggunakan trik pemetaan, yang di bawah kap didukung oleh turunan semacam ini
Satu catatan terakhir yang harus diperhatikan: derivatif screenspace dapat dihitung pada "kasar" / presisi rendah (artinya sepasang derivatif dibagi oleh seluruh quad) atau "halus" / presisi tinggi (artinya setiap piksel dibandingkan hanya dengan segera tetangga di quad, yang bisa memberikan empat pasangan turunan berbeda di atas quad). Kasar umumnya banyak, tetapi jika Anda melihat Anda mendapatkan blok 2x2 yang terlihat dalam efek Anda, itu adalah petunjuk yang baik Anda ingin beralih ke presisi halus / tinggi. ;)
(Pada diagram di atas, saya menggunakan perhitungan untuk turunan halus, tetapi berhati-hatilah bahwa hanya ddx / ddy sendiri dapat default ke derivatif kasar)
sumber
v
sini), dan karena itu adalah 2x2 quad, tidak ada piksel di antaranya. Jadi, jika kita menaungi fragmen kiri atas dari quad, dan v = 1 di sana, dan di fragmen kanan atas v = 4, maka ddx (v) = 3 (mengatakan "v bertambah 3 saat kita bergerak kiri ke kanan ")