Saya sedikit bingung. Dokumentasi resmi ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588(v=vs.85).aspx ) mengatakan bahwa ddx (input) adalah turunan parsial dari input dengan hormat ke "layar-ruang x-koordinat."
Kalkulus saya baik-baik saja, tetapi bagaimana cara mengetahui dari mana input berasal? Jika saya melewatinya fungsi, oke, saya bisa membayangkan apa yang akan dilakukannya, tetapi turunan dari angka selalu nol ...?
Apakah ini hanya penskalaan? Seperti, ini akan diskalakan ke sepersepuluh dari ukurannya pada jarak ini, sehingga mengembalikan sepersepuluh? Tapi itu tidak membutuhkan input ...
Dapatkah seseorang memberikan penjelasan singkat tentang apa yang sebenarnya terjadi?
ddx
danddy
lakukan sihir yang tidak bisa kamu lakukan sendiri. Mereka memiliki akses ke informasi tambahan dari pipa rasterisasi yang tidak dapat Anda peroleh dari dalam pixel shader. Saya tidak yakin formula mana yang mereka gunakan; Saya dituntun untuk percaya bahwa mereka menggunakan teknik estimasi, tetapi saya tidak tahu pasti.ddx(5)
agak tidak berguna. Gunakan dengan nilai input, dan itu akan memberi Anda turunan dari nilai itu sehubungan dengan piksel tetangga di blok. Sekali lagi, saya tidak tahu bagaimana tepatnya menghitung nilai, tetapi meminta turunan dari non-input mungkin hanya perilaku yang tidak terdefinisi dan menghasilkan sampah. Lihat fgiesen.wordpress.com/2011/07/10/10/... untuk informasi lebih banyak daripada yang bisa saya berikan.Jawaban:
Secara internal, GPU tidak pernah menjalankan pixel shader satu per satu. Pada tingkat granularitas terbaik, mereka selalu menjalankan 32-64 piksel pada saat yang sama menggunakan arsitektur SIMD. Dalam hal ini, piksel disusun lebih lanjut menjadi paha 2x2, sehingga setiap kelompok 4 piksel berturut-turut dalam vektor SIMD sesuai dengan blok piksel 2x2 di layar.
Derivatif dihitung dengan mengambil perbedaan antara piksel dalam satu kuad. Misalnya,
ddx
akan mengurangi nilai dalam piksel di sisi kiri quad dari nilai di sisi kanan, danddy
akan mengurangi piksel bawah dari yang atas. Perbedaan tersebut kemudian dapat dikembalikan sebagai turunan dari keempat piksel dalam kuad.Karena pixel shader berjalan di SIMD, dijamin bahwa nilai yang sesuai berada di register yang sama pada saat yang sama untuk semua piksel dalam quad. Jadi ekspresi atau nilai yang Anda masukkan ke apapun
ddx
atauddy
, akan dievaluasi di keempat piksel quad, maka nilai dari piksel yang berbeda dikurangi seperti dijelaskan di atas.Jadi mengambil turunan dari nilai konstan akan memberikan nol (seperti yang Anda harapkan dari kalkulus, kan?) Karena itu adalah nilai konstan yang sama di keempat piksel.
Perhatikan juga bahwa ada turunan "kasar" dan "baik",
ddx_coarse
/ddy_coarse
danddx_fine
/ddy_fine
. Penjelasan tentang perbedaan diberikan di sini . Hanya polosddx
/ddy
alias untuk versi kasar.BTW, alasan fungsi ini ada adalah bahwa GPU secara internal harus mengambil turunan dari koordinat tekstur untuk melakukan pemilihan mipmap dan penyaringan anisotropik. Karena perangkat keras memerlukan kemampuan itu (Anda dapat menggunakan sembarang ekspresi untuk koordinat tekstur dalam shader), itu cukup mudah untuk juga mengeksposnya ke programmer shader secara langsung.
sumber
ddx
berfungsi seperti fungsi lainnya dalam bahasa pemrograman tradisional; Anda mengevaluasi input, mengubahnya menjadi float atau apa pun, lalu lakukan fungsi luar (ddx
) untuk itu. Tetapi ini berbeda - dibutuhkan string input , mengevaluasinya di beberapa tempat, menghitung turunan, dan melaporkan hasilnya. Apakah itu benar?ddx
sebagai operasi pada ekspresi yang Anda masukkan ke dalamnya, bukan nilainya .