Refraktif cam gölgelendirici


10

Mozaiklik gölgelendirici çiftindeki bir nokta ızgarasının yorulmasıyla oluşturulan sonsuz bir altıgen zemine sahibim:

resim açıklamasını buraya girin

Bunun düz bir tel kafes olduğunu unutmayın - "gölgeler" bir aydınlatma hilesi:

resim açıklamasını buraya girin

Şimdi, bunun kalın, refraktif cam gibi görünmesini istiyorum, ancak nasıl ilerleyeceğinden emin değilim.

Akla ilk gelen şey

  1. blokların istenen "kalınlığını" içeren bir üniforma koymak
  2. Aydınlatmayı hesaplarken, aslında bir "kalınlık" üniformasının söylediği kadar kalınsa, bir ışının altıgen bloktan alacağı optik yol uzunluğunu hesaplamak için Snell'in yasasını kullanın ve alfa bu uzunluk boyunca toplayın. Bu şeffaflık sağlar, ancak içsel yansıma / TIR, vb.

resim açıklamasını buraya girin

Henüz denemedim, bu yüzden görsel sonucun ne olacağından emin değilim.

Nihayetinde, bu seviye için, disk savaşı sırasında Tron: Legacy'de kullanılan cam, altıgen zemin görünümünü elde etmeye çalışıyorum. ( Örnek için bu resme bakın .)

Öneriler?


1
Neyi başarmaya çalıştığınızı daha fazla açıklayabilir misiniz? Tron çekimi, kırılma değil çoğunlukla yansıma, AFAICT gösterir - çoğu çekimde zemin plakalarını gerçekten göremezsiniz. Sadece parlak bir yüzey istemediğinizi varsayarsak, zeminde ne görmek istersiniz? Göstermek istediğiniz alt zemin dokusu var mı? Zeminin altında bir sahne var mı (Tron'da olduğu gibi)? Yoksa daha farklı bir görüntü göremediğiniz, ancak bir yüzey altı saçılma etkisi olan buzlu cam gibi mi olmak istiyorsunuz?
Nathan Reed

Yüzey altı saçılma, buna ne denildiğini bilmiyordum. Google'ı kolaylaştırır. :)
3Dave

Yanıtlar:


4

GPU Gems'teki bu makale kırılma hakkında derinlemesine inceliyor, bu da oldukça güzel sonuçlar verebilir

(a) Tam şeffaflık (b) Kırılma camı

En temel anlamda

Temel kırılma tekniğinin ilk adımı, tüm kırılma ağlarını atlayarak sahne geometrisini bir dokuya dönüştürmektir. Bu doku, sonraki geçişte oluşturulacak kırılma nesnelerinin arkasında hangi nesnelerin görünür olduğunu belirlemek için kullanılabilir. Bu dokuyu S olarak belirtiyoruz.

İkinci adım, kırılma ağlarını, kırılma görünümünü simüle etmek için uygulanan bir pertürbasyon ile doku S'den gelen değerleri aramaktır. Pertürbasyon, normal harita kırmızı ve yeşil (XY) bileşenlerinin kullanıldığı ve yansıtılan doku koordinatlarına bir yer değiştirme eklemek için küçük bir değerle ölçeklendirildiği normal bir harita N kullanılarak elde edilebilir. Bu yaklaşım bir gölgelendiricide uygulamak kolaydır:

  1. doku N getir
  2. küçük bir değere (0.05 gibi) ölçeklenmiş XY bileşenlerini kullanın
  3. bu yer değiştirme değerini S için yansıtılan doku koordinatlarına ekleyin

Aşağıdaki liste bu yaklaşımı gösteren bir gölgelendiriciyi göstermektedir

half4 main(float2 bumpUV : TEXCOORD0,
  float4 screenPos : TEXCOORD1,
  uniform sampler2D tex0,
  uniform sampler2D tex1,
  uniform float4 vScale) : COLOR
{
  // fetch bump texture, unpack from [0..1] to [-1..1]
  half4 bumpTex=2.0 * tex2D(tex0, bumpUV.xy) - 1.0;

  // displace texture coordinates    
  half2 newUV = (screenPos.xy/screenPos.w) + bumpTex.xy * vScale.xy;

  // fetch refraction map
  return tex2D(tex1, newUV);
}

Sonraki resimler bu üç adımı göstermektedir

Yukarıdaki gölgelendiricide listelenen üç adım

Aynı makalede çok daha çekici bir görünüm elde edebilecek daha gelişmiş teknikler var


Unity'de benzer bir etki için Refraksiyon Shader wiki sayfasına göz atmak isteyebilirsiniz


3

Gösterdiğiniz görüntüyü , etkiyi nasıl hayal ettiğime dair bir referans olarak alacağım. Düşünebileceğim algoritma basit:

  1. Ortam yansımasını simüle etmek için ortamı küp harita dokusu düzeneğine dönüştürün.
  2. Küp harita dokusunu kırma tabanın altındaki katmanı temsil eden bir düzleme uygulayın. Henüz uçağı oluşturma.
  3. Düzlemi normal bir 2B dokuya dönüştürün.
  4. Dokuyu kırma tabanını oluşturmak için kullanılan kırma gölgelendiricisine geçirin.
  5. Şimdi kırılma kafeslerini / zemini bir kırılma gölgelendiricisi ile render edin.

Kırılma gölgelendirici ile ilgili olarak, camı simüle etmek için

  • Yansımayı ve kırılmayı simüle etmek için fresnel terimini kullanın.
  • Doku getirme yapmak için normalleri / normal haritayı kullanın.

Sadece fikri düşündüm, bu yüzden test etmedim. Eminim daha fazla işe ihtiyaç duyar, Belki işten döndüğümde yapacağım.


İlginç bir yaklaşım - Bunu bir süreliğine güveç yapmalıyım. Giriş için teşekkürler.
3Dave
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.