Environmental mapping + skybox
Tym razem będzie mały update dotyczący silnika. Niby nic, ale można się pochwalić.
Po pierwsze Environmental mapping, czyli proste przybliżenie zjawiska odbicia światła na powierzchni ciała oraz załamania światła na granicy dwóch ośrodków. Wymaga dostarczenia tylko dodatkowej tekstury sześciennej (cube-mapa) oraz skorzystania z dwóch dodatkowych funkcji HLSL: refract i reflect. Można go wzbogacić dodatkowo o efekt Fresnela i rozszczepienie chromatyczne. Całość wygląda jak na screenie obok. Efekt ten nie jest trudny do zaimplementowania, więc szczegółów implementacyjnych nie będzie, zresztą są one w książce CG Tutorial.
Kolejną rzeczą jest skybox. Jak nazwa wskazuje, jest to pudełko z tłem nieba, które powoduje, że scena z obiektami nie wygląda po prostu pusto. Poniżej przedstawiam trzy kroki rysowania skyboxa:
- Potrzebne jest pudełko wraz z teksturą, którą jest już wspomniana wcześniej cube-mapa. Biblioteka D3DX posiada do tego odpowiednią funkcję: D3DXCreateBox(), która jako parametry przyjmuje wymiary pudełka. Najlepiej jest stworzyć sześcian 1:1:1.
- Pudełko powinno obracać się razem z kamerą, ale nie może zmieniać swojej pozycji. Aby to osiągnąć należy użyć tylko macierzy widoku i projekcji. przy czym ostatni wiersz tej pierwszej powinien mieć takie wartości: (0, 0, 0, 1).
- Skybox powinien być pierwszym elementem rysowanym na scenie, a dodatkowym warunkiem koniecznym by był on tłem całej sceny jest wyłączenie zapisu do ZBuffera. Dzięki temu każdy kolejny obiekt sceny będzie rysowany zawsze przed skyboxem. Aby odczytać kolor tekstury zamiast funkcji tex2D należy wykorzystać funkcję texCUBE, do której jako współrzędne tekstury przekazuje się pozycję danego pixela.
Jak widać nie jest to skomplikowane, a dzięki temu scena wygląda o wiele lepiej.
Xion:
Ostatni wiersz równy 0,0,0,1 oznacza tyle, że nie jest wykonywana żadna translacja w ramach przekształcenia widoku/projekcji. Zamiast tego można po prostu używać macierzy z samą rotacją kamery.
11 December 2009, 9:06 pmNetrix:
Oczywiście, że tak jest, bo chodzi o to, żeby pozostały same obroty. Akurat u siebie to mam uproszczone do tego stopnia, że kamerka ma tylko jedną macierz.
11 December 2009, 9:13 pmReg:
Jest to trochę trudniejsze, bo trzeba pomyśleć jak rozwiązać Z-test, ale profesjonalniej jest rysować niebo jako OSTATNIE. Wtedy oszczędza się fillrate. Rozwiązanie, którego ja używam, to włączenie do rysowania nieba Z-testu i ustawienie SetViewport z MinZ = MaxZ = 1.
13 December 2009, 5:35 pmNetrix:
Wielkie dzięki za rozwiązanie. Myślałem nad tym, żeby przesunąć rysowanie tła na koniec, ale tylko przez kombinacje ustawieniami ZBuffera. O Viewport kompletnie zapomniałem, pewnie przez to, że z niego bezpośrednio nie korzystam.
14 December 2009, 4:10 pmTomasz Dąbrowski:
Można sobie też uprościć życie i zamiast boxa rysować po prostu Full Screen Quada teksturowanego texCube(skybox, ViewVector). :)
20 January 2010, 4:09 am