Saya telah mempelajari contoh-contoh Nvidia dari SDK, khususnya proyek Island11 dan saya telah menemukan sesuatu yang ingin tahu tentang sepotong kode HLSL yang mengoreksi refleksi naik dan turun tergantung pada keadaan ketinggian gelombang.
Secara alami, setelah memeriksa paragraf kode singkat:
// calculating correction that shifts reflection up/down according to water wave Y position
float4 projected_waveheight = mul(float4(input.positionWS.x,input.positionWS.y,input.positionWS.z,1),g_ModelViewProjectionMatrix);
float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w;
projected_waveheight = mul(float4(input.positionWS.x,-0.8,input.positionWS.z,1),g_ModelViewProjectionMatrix);
waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w;
reflection_disturbance.y=max(-0.15,waveheight_correction+reflection_disturbance.y);
Dugaan pertama saya adalah bahwa ia mengkompensasi refleksi planar ketika mengalami gangguan vertikal (gelombang), menggeser geometri pantul ke titik di mana tidak ada apa-apa dan air hanya berubah seolah-olah tidak ada apa-apa di sana atau hanya di langit:
Nah, itulah langit yang memantulkan di mana kita seharusnya melihat pantulan hijau / abu-abu / kekuningan di dataran itu bertautan dengan garis dasar air. Masalah saya sekarang adalah saya tidak bisa menentukan dengan tepat apa logika di baliknya. Memproyeksikan posisi ruang dunia aktual dari titik geometri gelombang / air dan kemudian mengalikannya dengan -.5f, hanya untuk mengambil proyeksi lain dari titik yang sama, kali ini dengan koordinat y berubah menjadi -0.8 (mengapa -0.8?).
Petunjuk dalam kode tersebut tampaknya mengindikasikan bahwa kode itu diturunkan dengan coba-coba karena ada redundansi. Sebagai contoh, penulis mengambil setengah negatif dari koordinat y yang diproyeksikan (setelah pembagian):
float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w;
Dan kemudian melakukan hal yang sama untuk poin kedua (hanya positif, untuk mendapatkan perbedaan, saya kira) dan menggabungkan mereka:
waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w;
Dengan menghapus pembagian dengan 2, saya tidak melihat perbedaan dalam peningkatan kualitas (jika seseorang peduli untuk memperbaiki saya, silakan lakukan). Inti dari itu tampaknya adalah perbedaan dalam proyeksi y, mengapa begitu? Redundansi ini dan pemilihan -8f dan -0.15f yang tampaknya sewenang-wenang membuat saya menyimpulkan bahwa ini mungkin kombinasi heuristik / tebakan. Apakah ada dasar logis untuk ini atau itu hanya hack putus asa?
Berikut ini adalah berlebihan dari masalah awal yang diperbaiki oleh fragmen kode, amati pada tingkat tessellation terendah. Mudah-mudahan, itu bisa memunculkan ide saya hilang. The -.8f mungkin merupakan referensi ketinggian untuk menyimpulkan berapa banyak yang mengganggu tekstur koordinat sampel, geometri yang tercermin secara render dan -.15f mungkin merupakan batas bawah, ukuran keamanan.