Szkło refrakcyjne

10

Mam nieskończoną sześciokątną podłogę, wygenerowaną przez mozaikowanie siatki punktów w parze modułów cieniujących mozaikowania:

wprowadź opis zdjęcia tutaj

Zauważ, że jest to płaski szkielet - „cienie” to sztuczka oświetleniowa:

wprowadź opis zdjęcia tutaj

Teraz chciałbym, aby wyglądało to na grube, refrakcyjne szkło, ale nie jestem pewien, jak postępować.

Pierwszą rzeczą, jaka przyszła mi do głowy, jest

  1. ustaw mundur zawierający żądaną „grubość” bloków
  2. Podczas obliczania oświetlenia użyj prawa Snell'a, aby obliczyć długość ścieżki optycznej, którą promień przejdzie przez blok heksadecym, jeśli faktycznie jest tak gruby, jak mówi mundur „grubości”, i zsumuj wartość alfa na tej długości. To dałoby przezroczystość, ale nie radzi sobie z takimi rzeczami jak odbicie wewnętrzne / TIR itp.

wprowadź opis zdjęcia tutaj

Jeszcze tego nie próbowałem, więc nie jestem pewien, jaki byłby efekt wizualny.

Ostatecznie, na tym konkretnym poziomie, staram się uzyskać ten szklany, sześciokątny wygląd podłogi użyty w Tron: Dziedzictwo podczas bitwy na dysku. ( Zobacz to zdjęcie jako przykład .)

Propozycje?

3Dave
źródło
1
Czy możesz wyjaśnić więcej, co chcesz osiągnąć? Ujęcie Tron pokazuje głównie odbicie, AFAICT, a nie załamanie - w większości ujęć naprawdę nie widać przez płytki podłogowe. Zakładając, że nie chcesz tylko błyszczącej powierzchni, co chcesz zobaczyć przez podłogę? Czy chcesz pokazać teksturę podłoża? Czy pod podłogą jest jakaś scena (jak w Tronie)? A może chcesz bardziej przypominać matowe szkło, w którym nie widać wyraźnego obrazu, ale ma efekt rozpraszania pod powierzchnią?
Nathan Reed
Rozpraszanie podpowierzchniowe, chociaż nie wiedziałem, że tak to się nazywa. Ułatwia Google. :)
3Dave

Odpowiedzi:

4

Ten artykuł w GPU Gems zawiera szczegółowe informacje na temat refrakcji, która może dać całkiem niezłe wyniki

(a) Pełna przezroczystość (b) Szkło refrakcyjne

W najbardziej podstawowym tego słowa znaczeniu

Pierwszym krokiem podstawowej techniki refrakcji jest przekształcenie geometrii sceny w teksturę, pomijając wszystkie siatki refrakcyjne. Tej tekstury można użyć do określenia, które obiekty są widoczne za obiektami refrakcyjnymi, które zostaną wyrenderowane w kolejnym przejściu. Oznaczamy tę teksturę jako S.

Drugim krokiem jest renderowanie siatek refrakcyjnych, wyszukiwanie wartości z tekstury S z perturbacją zastosowaną w celu symulacji efektu refrakcji. Zaburzenie to można osiągnąć za pomocą normalnej mapy N, gdzie komponenty mapy normalnej czerwonej i zielonej (XY) są używane i skalowane o niewielką wartość, aby dodać przesunięcie do rzutowanych współrzędnych tekstury. To podejście jest łatwe do wdrożenia w module cieniującym:

  1. pobierz teksturę N
  2. użyj komponentów XY skalowanych według małej wartości (np. 0,05)
  3. dodaj tę wartość przesunięcia do rzutowanych współrzędnych tekstury dla S

Poniższa lista pokazuje moduł cieniujący, który demonstruje to podejście

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);
}

Następne obrazy ilustrują te trzy kroki

Trzy kroki wymienione w powyższym module cieniującym

W tym samym artykule znajdują się bardziej zaawansowane techniki, które mogą osiągnąć znacznie bardziej atrakcyjny wygląd


Aby uzyskać podobny efekt w Unity, możesz zajrzeć na stronę wiki The Refraction Shader

klucz kodowy
źródło
3

Wezmę pokazany obraz jako odniesienie do tego, jak wyobrażam sobie efekt. Algorytm, o którym myślę, jest prosty:

  1. Renderuj środowisko w mapę tekstury kostki, aby symulować odbicie środowiska.
  2. Zastosuj teksturę mapy sześcianu do płaszczyzny, która reprezentuje warstwę poniżej podłogi refrakcyjnej. Nie renderuj jeszcze samolotu.
  3. Renderuj płaszczyznę w teksturę, normalną teksturę 2D.
  4. Podaj teksturę do modułu refrakcyjnego używanego do renderowania podłogi refrakcyjnej.
  5. Teraz renderuj siatki refrakcyjne / podłogę za pomocą shadera refrakcji.

Jeśli chodzi o moduł cieniujący załamanie, należy symulować szkło, które można zrobić

  • Użyj terminu Fresnela, aby zasymulować odbicie i załamanie światła.
  • Użyj mapy normalnej / normalnej, aby pobrać teksturę.

Właśnie pomyślałem o tym pomyśle, więc go nie przetestowałem. Jestem pewien, że potrzebuje więcej pracy. Może zrobię to, kiedy wrócę z pracy.

concept3d
źródło
Ciekawe podejście - będę musiała się trochę na tym dusić. Dzięki za wkład.
3Dave