Nvidia'nın SDK örneklerini, özellikle Island11 projesini inceledim ve dalganın yüksekliğinin durumuna bağlı olarak yukarı ve aşağı yansımaları düzelten bir HLSL kodu parçası hakkında merak edilen bir şey buldum.
Doğal olarak, kısa kod paragrafını inceledikten sonra:
// 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);
İlk tahminim, düşey pertürbasyona (dalgalara) maruz kaldığında düzlemsel yansımayı telafi etmesi, yansıyan geometriyi hiçbir şeyin olmadığı bir noktaya kaydırması ve suyun sanki orada veya sadece gökyüzü yokmuş gibi yaratılmasıydı:
Şimdi, arazinin yeşil / gri / sarımsı yansımasını suyun taban çizgisi ile eğilmiş olduğunu görmemiz gereken gökyüzü. Benim sorunum şimdi arkasındaki mantığın ne olduğunu gerçekten tam olarak belirleyemiyorum. Dalga / su geometrisinin bir noktasının gerçek dünya uzay konumunu tahmin etmek ve sonra -.5f ile çarpmak, sadece aynı noktanın başka bir projeksiyonunu almak için, bu sefer y koordinatı -0.8 olarak değiştirildi (neden -0.8?).
Koddaki ipuçları, artıklık olduğu için deneme yanılma yöntemiyle türetildiğini gösteriyor. Örneğin, yazar tahmin edilen y koordinatının negatif yarısını alır (w bölünmesinden sonra):
float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w;
Ve sonra aynı şeyi ikinci nokta için yapar (sadece pozitif, bir çeşit fark elde etmek için, sanırım) ve bunları birleştirir:
waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w;
Bölmeyi 2'ye çıkararak, kalite iyileştirmede hiçbir fark görmüyorum (eğer birisi beni düzeltmeyi umursa, lütfen yapın). Bunun temel noktası, tahmin edilen y'deki fark gibi görünüyor, neden bu? Bu fazlalık ve görünüşte keyfi olarak -.8f ve -0.15f seçimi, bunun sezgisel tarama / tahmin çalışmasının bir kombinasyonu olabileceği sonucuna varmamı sağlıyor. Bunun mantıklı bir dayanağı var mı, yoksa sadece umutsuz bir hack mi?
Kod parçasının düzelttiği ilk sorunun abartıldığı, en düşük mozaikleme düzeyinde gözlemlediği. Umarım, kaçırdığım bir fikre yol açabilir. -.8f, düzlemsel olarak yansıtılan geometri oluşturmayı örnekleyen doku koordinatını ne kadar rahatsız edeceğinizi saptamak için bir referans yükseklik olabilir ve -.15f alt sınır, bir güvenlik önlemi olabilir.