Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Dual Paraboloid Mapping Michał Drobot Technical Art Director Reality Pump.

Podobne prezentacje


Prezentacja na temat: "Dual Paraboloid Mapping Michał Drobot Technical Art Director Reality Pump."— Zapis prezentacji:

1 Dual Paraboloid Mapping Michał Drobot Technical Art Director Reality Pump

2 Mapowanie dookolneMapowanie dookolne Parametryzacja matematycznaParametryzacja matematyczna ImplementacjaImplementacja ZastosowanieZastosowanie Plan wykładu

3 SześcienneSześcienne Wymaga 6 tekstur – cubemapaWymaga 6 tekstur – cubemapa Wspierane hardwareowoWspierane hardwareowo Wymaga 6 krotnego przerenderowania scenyWymaga 6 krotnego przerenderowania sceny SferyczneSferyczne Wymaga 1 teksturyWymaga 1 tekstury 1 krotne przerenderowanie1 krotne przerenderowanie Zależne od widokuZależne od widoku Mało stabilneMało stabilne Słaba jakośćSłaba jakość Brak obiektów centralnie za kuląBrak obiektów centralnie za kulą Mapowanie dookolne

4

5 Dual paraboloid mappingDual paraboloid mapping Wymaga 2 teksturWymaga 2 tekstur 2 przebiegi renderowania sceny2 przebiegi renderowania sceny Niezależne od kąta patrzeniaNiezależne od kąta patrzenia Zawiera cała scenęZawiera cała scenę Niski poziom artefaktów i dystorsjiNiski poziom artefaktów i dystorsji Paraboloid mapping

6

7 Dzielimy przestrzeń na dwie półkuleDzielimy przestrzeń na dwie półkule Każdy promień padający na półkule jest odbity równolegle w kierunku półkuliKażdy promień padający na półkule jest odbity równolegle w kierunku półkuli Jest to istota mapowania paraboloidalnegoJest to istota mapowania paraboloidalnego

8 Szukamy wektora normalnego dowolnego punktu płaszczyzny zadanej przez równanie paraboloidySzukamy wektora normalnego dowolnego punktu płaszczyzny zadanej przez równanie paraboloidy Używamy do tego wektorów tangentowych z pierwszej pochodnej oraz ich iloczynu wektorowegoUżywamy do tego wektorów tangentowych z pierwszej pochodnej oraz ich iloczynu wektorowego Paraboloid mapping

9

10 Musimy odnaleźć punkt przecięcia promienia padającego z płaszczyznąMusimy odnaleźć punkt przecięcia promienia padającego z płaszczyzną W tym celu musimy znać wektor padający jak i odbityW tym celu musimy znać wektor padający jak i odbity Obserwacja : przy parametryzacji paraboloidy wszystkie wektory odbite są równoległe i równe bądź dla tylnej połówkiObserwacja : przy parametryzacji paraboloidy wszystkie wektory odbite są równoległe i równe bądź dla tylnej połówki Suma wektora padającego i odbitego powinna równać się normalnej płaszczyzny o która nastąpiła refleksjaSuma wektora padającego i odbitego powinna równać się normalnej płaszczyzny o która nastąpiła refleksja Paraboloid mapping

11

12 Ostatnie równanie stanowi podstawę implementacjiOstatnie równanie stanowi podstawę implementacji Zaczynamy od generacji map paraboloidalnychZaczynamy od generacji map paraboloidalnych Zapisujemy w nich kolor do mapowania odbić, bądź głębie do mapowania cieniZapisujemy w nich kolor do mapowania odbić, bądź głębie do mapowania cieni Paraboloid mapping

13 Potrzebujemy trzech macierzyPotrzebujemy trzech macierzy World – normalna macierz świataWorld – normalna macierz świata View – tworzymy normalnie traktując za kamere punkt P (środek paraboloidy – miejsce światła, bądź źródła refleksji)View – tworzymy normalnie traktując za kamere punkt P (środek paraboloidy – miejsce światła, bądź źródła refleksji) Używamy położenia punktu P w świecie jako translacjiUżywamy położenia punktu P w świecie jako translacji Rotacja wyznacza orientacje hemisfer paraboloidRotacja wyznacza orientacje hemisfer paraboloid Projekcja – używamy identyczności, z racji ręcznej projekcjiProjekcja – używamy identyczności, z racji ręcznej projekcji Implementacja

14 Szukamy wektora padającegoSzukamy wektora padającego float L = length( output.Position.xyz ); output.Position = output.Position / L;float L = length( output.Position.xyz ); output.Position = output.Position / L; Wyliczamy koordynaty miejsca przecięciaWyliczamy koordynaty miejsca przecięcia output.Position.z = output.Position.z + 1; output.Position.x = output.Position.x / output.Position.z; output.Position.y = output.Position.y / output.Position.z;output.Position.z = output.Position.z + 1; output.Position.x = output.Position.x / output.Position.z; output.Position.y = output.Position.y / output.Position.z; Implementacja

15 Skalujemy wartość Z i ustawiamy WSkalujemy wartość Z i ustawiamy W output.Position.z = (L - NearPlane) / (FarPlane - NearPlane); output.Position.w = 1;output.Position.z = (L - NearPlane) / (FarPlane - NearPlane); output.Position.w = 1; Skalujemy wartość Z i ustawiamy WSkalujemy wartość Z i ustawiamy W W pixel shaderze wycinamy pixele znajdujące się ZA hemisfera poprzez clip()W pixel shaderze wycinamy pixele znajdujące się ZA hemisfera poprzez clip() Implementacja

16 Implementacja

17 Podczas odczytu mapy paraboloidalnejPodczas odczytu mapy paraboloidalnej Generujemy koordynaty w sposób analogiczny do generowania mapyGenerujemy koordynaty w sposób analogiczny do generowania mapy Dla refleksji tworzymy je jak w enviromental mappinguDla refleksji tworzymy je jak w enviromental mappingu Paraboloid mapping

18 // Wyliczamy koordynaty przedniej hemisfery float2 front; front.x = R.x / (R.z + 1); front.y = R.y / (R.z + 1); front.x =.5f * front.x +.5f; //bias and scale to correctly sample a d3d texture front.y = -.5f * front.y +.5f; // Wyliczamy koordynaty tylnej hemisfery float2 back; back.x = R.x / (1 - R.z); back.y = R.y / (1 - R.z); back.x =.5f * back.x +.5f; //bias and scale to correctly sample a d3d texture back.y = -.5f * back.y +.5f;// Wyliczamy koordynaty przedniej hemisfery float2 front; front.x = R.x / (R.z + 1); front.y = R.y / (R.z + 1); front.x =.5f * front.x +.5f; //bias and scale to correctly sample a d3d texture front.y = -.5f * front.y +.5f; // Wyliczamy koordynaty tylnej hemisfery float2 back; back.x = R.x / (1 - R.z); back.y = R.y / (1 - R.z); back.x =.5f * back.x +.5f; //bias and scale to correctly sample a d3d texture back.y = -.5f * back.y +.5f; // Samplujemy mapy float4 forward = tex2D( FrontTex, front ); // sample the front paraboloid map float4 backward = tex2D( BackTex, back ); // sample the back paraboloid map// Samplujemy mapy float4 forward = tex2D( FrontTex, front ); // sample the front paraboloid map float4 backward = tex2D( BackTex, back ); // sample the back paraboloid map Paraboloid mapping

19 Wybieramy właściwy sampel poprzez sprawdzenie wartości ZWybieramy właściwy sampel poprzez sprawdzenie wartości Z Dla shadow mappingu szukamy wektora od vertexa do centrum paraboloidyDla shadow mappingu szukamy wektora od vertexa do centrum paraboloidy Paraboloid mapping

20 Podsumowanie For more information contact me Slides will be available at Drobot.org

21 Questions ?


Pobierz ppt "Dual Paraboloid Mapping Michał Drobot Technical Art Director Reality Pump."

Podobne prezentacje


Reklamy Google