Apa itu turunan ruang layar dan kapan saya akan menggunakannya?


12

Saya melihat fungsi ddxdan ddyglsl 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:

  1. Apa fungsi turunan screenspace?
  2. Apa fungsi ini lakukan? Nilai input dan nilai output
  3. Efek apa yang paling sering mereka gunakan?
  4. Apa jenis efek yang mengharuskan Anda melihat ke fungsi ini?

Di masa lalu saya telah menggunakan ini untuk warp tekstur, di mana warp dapat menyebabkan miplevel yang salah dipilih untuk beberapa fragmen; biasanya miplevel yang lebih rendah, sehingga Anda bisa melihat teksturnya yang sangat jelas bergeser secara detail saat melengkung. Mengambil turunan dari texcoords yang tidak berombak, lalu menghitung lungsin, kemudian menggunakan tex2Dgrad / SampleGrad / teksturGrad dengan texcoords yang melengkung dan turunannya mencegah hal ini terjadi.
Maximus Minimus

@ LeComteduMerde-fou apa itu warps tekstur? Google cepat menunjukkan maksud Anda membungkus?
NeomerArcana

Tidak, maksud saya warps , yaitu mendistorsi tekstur dengan mengubah coord tekstur dari waktu ke waktu.
Maximus Minimus

Lihat pertanyaan terkait ini . Saya tidak berpikir itu cukup duplikat, karena pertanyaan terkait bertanya lebih lanjut tentang bagaimana fungsi-fungsi ini bekerja / bagaimana mereka dihitung, alih-alih tingkat yang lebih tinggi "apa ini dan apa gunanya?"
DMGregory

Halo Saya sangat tertarik dengan hal ini. Saya saat ini menggunakannya untuk melakukan pemetaan bump tanpa garis singgung atau bitangent tapi pada dasarnya saya menyalin-menempelkan kode. ... Saya berpikir untuk menggunakannya untuk itu ... tapi saya tidak tahu bagaimana mengubah turunan layar-ruang ini menjadi normal ruang-dunia menggunakan beberapa aljabar linier yang murah. Mungkin saya perlu kebalikan dari matriks proyeksi kamera.
Prokop Hapala

Jawaban:


12

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

Diagram yang menggambarkan turunan dalam segitiga raster

Turunan screenspace dari variabel (atau ekspresi) vdi shader Anda adalah perbedaan dalam nilai v(pada saat itu dalam kode) dari satu sisi quad 2x2 pixel ini ke yang lain. yaitu. ddxadalah nilai vdalam piksel kanan minus nilai vdi kiri, dan juga untuk ddydi vertikal.

Ini menjawab "seberapa cepat vkenaikan 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 yang vmeningkat 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 uvarah vertikal bidang lantai yang bertekstur, ddy(uv.y)akan sangat besar dibandingkan dengan ddx(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 tex2Dloddalam 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)


Ketika Anda mengatakan itu adalah perbedaan antara piksel dari satu sisi blok 2x2 ke yang lain, apakah perbedaan dalam nilai piksel, atau perbedaan dalam posisi texel? Jika itu perbedaan nilainya, apakah ini meringkas texels di antara atau sesuatu?
NeomerArcana

Ini perbedaan dalam nilai argumen (di vsini), 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 ")
DMGregory

Saya masih tidak begitu mengerti. Jika saya melihat dari sudut tertentu, blok 2x2 mungkin tidak terdiri dari piksel berdampingan dalam tekstur. Jadi perbedaan nilainya, apakah perbedaan antara dua texel yang dipilih, atau perbedaan antara dua texel yang dipilih dengan mempertimbangkan yang dilewati?
NeomerArcana

Lupa texels - itu bukan sampel tekstur. Itu mengambil nilai literal dari argumen yang Anda berikan ke ddx atau ddy, dan membandingkannya dengan nilai yang diteruskan ke ddx atau ddy saat mengevaluasi fragmen tetangga. Jika nilai itu berasal dari sampel tekstur, ya, tapi fungsi turunannya tidak memiliki pengetahuan tentang tekstur. Mereka hanya mengurangi angka. Saya akan mencoba menambahkan diagram untuk jawaban ini setelah saya kembali ke PC saya.
DMGregory

Oh saya rasa saya mengerti sekarang. Akan bagus untuk mendapatkan diagram tapi saya rasa saya mengerti. Ini tampak seperti fungsi yang sangat berguna.
NeomerArcana
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.