Jak renderować lustro lub inne powierzchnie odblaskowe?


16

Zastanawiałem się, jak stworzyć lustro w grze 3D? Moją sugestią jest / było śledzenie promieni, uderzanie w obiekt „lustrzany”, a następnie rysowanie obrazu drugiej kamery na obiekcie „lustrzanym”, który znajduje się w „punkcie” lustrzanym w oryginalnej kamerze, przy użyciu uderzonej strony obiektu lustrzanego jako płaszczyzna odbicia.

Musielibyśmy użyć jednego promienia pochodzącego ze środka oryginalnej kamery, aby określić punkt, w którym środek widzenia znajduje się na płaszczyźnie lustra.


1
Czy chciałbyś mieć szkic / rysunek „jak miałem na myśli” tę rzecz?
daemonfire300,

Możesz spróbować opublikować to na stackoverflow.com, ponieważ nie jest to bezpośrednio związane z tworzeniem gier; być może jest tam więcej ekspertów graficznych, którzy mogą ci pomóc.
Ricket

Odpowiedzi:


14

Jeśli korzystasz z OpenGL, sekcja 9 OpenGL FAQ: Transformacje opisuje dokładnie, jak to zrobić. I nie, nie wymaga śledzenia promieni, ponieważ jest to, co zrozumiałe, bardzo nieefektywny (ale wysokiej jakości) sposób na osiągnięcie tego.

9.170 Jak renderować lustro?

Oto, co mówi wpis FAQ, a przykładowy kod pokazuje:

  • Skonfiguruj macierz widoku odbitego. Postępowanie w przypadku lusterek wyrównanych do osi wyjaśniono w drugim akapicie.
  • Narysuj scenę
  • Przywróć matrycę widoku i wyczyść bufor głębokości
  • Renderuj ponownie scenę; rzeczywista geometria lustra w tej scenie powinna być półprzezroczysta lub całkowicie przezroczysta, aby można było przejść do poprzednio renderowanej lustrzanej sceny.

Oczywiście jest wiele miejsca na optymalizację. Podczas renderowania sceny odbitej prawdopodobnie powinieneś możliwie dużo wygładzania, ponieważ lustra są zwykle małe, a domyślne wygaszanie poza ekranem nie uruchamia się dla geometrii, która jest na ekranie, ale nie jest widoczna przez lustro. Możesz także renderować uproszczoną wersję sceny przez lustro. W celu uzyskania efektów i aby ukryć użytkownika przed zauważeniem obniżonej jakości, możesz zastosować moduł cieniujący (np. Rozmycie lub jasny / wyprany) podczas wykonywania lustrzanego renderowania.

Wyobrażam sobie, że jeśli używasz DirectX, procedura byłaby taka sama.


3
Alternatywą, jeśli masz więcej pamięci niż czas renderowania, jest po prostu odzwierciedlenie geometrii świata przez lustro w edytorze 3D, a następnie możesz zmodyfikować go tak, aby wyglądał, jak chcesz (wymuszaj niższe poziomy mip itp.). Zrobiliśmy to na PS1, gdzie rzeczy siedzące na błyszczącej podłodze zostały zduplikowane / odwrócone pod ziemią, a sama podłoga stała się półprzezroczysta.
dash-tom-bang

Zauważ, że przykładowy kod odnosi się do przestarzałej specyfikacji OpenGL. Niemniej jednak koncepcja jest uniwersalna i prawdopodobnie może być stosowana podobnie przy użyciu najnowszej specyfikacji OpenGL .
patryk.beza
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.