Düzlemsel yansımalar yaparken dalgaların muhasebeleştirilmesi


13

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ı:

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin

Yanıtlar:


1

Bu teknik bu artefakta sahip olmak zorundadır ve bu yüzden çoğu zaman kullanıldığında, gerçek yansıma düzlemi gerçek konumunun yarım metre üzerindeyse, aramaya dikey bir kaydırma uygularız. Evet, mükemmel uyum sağlayan bir yansımanın olmaması dezavantajına sahiptir, ancak deliklere tercih edilir.


2
Daha fazla ayrıntı verebilir misiniz?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.