1 / 14

Programowanie gier komputerowych Tomasz Martyn

Programowanie gier komputerowych Tomasz Martyn. Wykład 4. Rendering - informacje podstawowe. Z punktu widzenia dzisiejszego programowania gier: Direct3D jest najczęściej wykorzystywanym przez profesjonalnych deweloperów gier API graficznym na platformie Microsoft Windows

Download Presentation

Programowanie gier komputerowych Tomasz Martyn

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programowanie gier komputerowychTomasz Martyn Wykład 4. Rendering -informacje podstawowe

  2. Z punktu widzenia dzisiejszego programowania gier: • Direct3D • jest najczęściej wykorzystywanym przez profesjonalnych deweloperów gier API graficznym na platformie Microsoft Windows • jest de facto jedynym API graficznym na platformach konsolowych Microsoft XBox i Xbox 360 oraz mobilnych Windows Phone • OpenGL (i jego warianty, np. OpenGL ES) • jest wieloplatformowy – sterowniki OpenGLa istnieją dla prawie każdego sprzętu 3D • jest nadal popularny wśród programistów gier na platformie Microsoft Windows • jest standardem de facto na platformach Mac OS i iPhone, linuksowych (PC i wiele smartfonów - Android), Nintendo, Sony • Wniosek: • Jeżeli tworzona gra jest przeznaczona na różne platformy, wówczas w silniku gry warto utworzyć warstwę abstrakcji renderera, która oddziela konkretne API graficzne od reszty modułów silnika. OpenGL vs. DirectX (The API Wars)

  3. Jednakże nawet w ramach konkretnego API bywają duże różnice w odniesieniu do jego poszczególnych wersji, które powodują, że w implementacji interfejsu renderera różne wersje danego API muszą być traktowane odrębnie. Z punktu widzenia przenoszenia gier na różne platformy, największą zmianą było odejście (w obydwu API) od wspierania postulatu wsteczniej kompatybilności. Zmiana ta odbyła się za sprawą usunięcia funkcjonalności stałego potoku graficznego (fixed-functionpipeline) na rzecz potoku programowanego (programmablepipeline) przy użyciu shaderów. Nastąpiło to wraz z wprowadzaniem wersji OpenGL 3.1 (odpowiednio OpenGL ES 2.0) oraz DirectX 10. OpenGL vs. OpenGL i DirectX vs. DirectX

  4. Ewolucja potoku graficznego (1) programowalny potok Shader Model 2 i 3 (OpenGL 2.0, DirectX 9) stały potok (OpenGL 1.5, DirectX 7)

  5. Ewolucja potoku graficznego (2) programowalny potok Shader Model 5 (OpenGL 4.0, DirectX 11) programowalny potok Shader Model 4 (OpenGL 3.0, DirectX 10)

  6. Potok transformacji współrzędnych wierzchołków • w stałympotoku poszczególne transformacje przekazywane są do potoku za pośrednictwem odpowiednich funkcji API i potok sam stosuje je do nadchodzących wierzchołków • w programowalnym potokuOpenGL 2.0 jest prawie tak samo, za wyjątkiem faktu, że o zastosowanie transformacji do wierzchołków musimy zadbać sami w kodzie shadera wierzchołków (transformacje są widoczne jako zmienne wbudowane) • w programowalnych potokachOpenGL 3.0 i 4.0 oraz DirectX transformacje przekazywane są do shadera wierzchołków po prostu jako jedne z jego możliwych parametrów (zmienne uniform – OpenGL i DirectX 9 lub bufory stałych cbuffer – DirectX 10 i 11)

  7. OpenGL (i XNA) DirectX Lewoskrętny i prawoskrętny układ współrzędnych Aby przejść z jednego układu na drugi trzeba zastosować do wizualizowanego świata odbicie zwierciadlane w płaszczyźnie XY. Czasem należy również zmienić kierunek „nawinięcia” (winding) wielokątów w siatkach na przeciwny (w przypadku gdy stosowany jest backfaceculling) w celu określenia widocznej strony wielokąta. Domyślnie OpenGL uznaje wielokąty o nawinięciu przeciwnym do ruchu wskazówek zegara za ułożone przodem, zaś DirectX (i XNA) wprost przeciwnie.

  8. Przestrzenią modelu (model space, localspace) nazywany jest układ współrzędnych skojarzony bezpośrednio z danym modelem, zwykle w procesie modelowania. W konsekwencji, z każdym z modeli związany jest odrębny układ współrzędnych modelu, względem którego określone są wartości współrzędnych wierzchołków siatki wielokątów. Przestrzeń modelu

  9. Współrzędne wierzchołków danego modelu określone w przestrzeni modelu przekształcane są do przestrzeni świata (worldspace, globalspace), która jest układem współrzędnych związanych z wizualizowaną sceną. Transformacja danego modelu do przestrzeni świata dokonywana jest przy użyciu – związanego z tym modelem - przekształcenia świata (worldtransformation), które jest wyznaczane w procesie komponowania sceny i ew. aktualizowane na bieżąco w przypadku modelu dynamicznie przemieszczającego się po scenie (w przypadku modeli statycznych odwzorowanie jest stałe). Stały potok DirectX Przestrzeń świata Stały potok OpenGL i programowalny OpenGL 2.0

  10. Następnie, współrzędne wierzchołków przekształcane są do przestrzeni kamery (viewspace, cameraspace), która jest układem współrzędnych związanych z punktem położenia kamery (obserwatora) w świecie i kierunkiem jej „patrzenia”. Transformacja ta dokonywana jest przy użyciu – związanego z kamerą - przekształcenia obserwatora (viewtransformation), które jest wyznaczane w procesie komponowania sceny i następnie aktualizowane na bieżąco gdy kamera przemieszcza się po scenie. Przestrzeń kamery Stały potok DirectX Stały potok OpenGL i programowalny OpenGL 2.0

  11. Ostrosłup widzenia (frustum) można rozpatrywać jako uproszczony model kamery. • Jest on zdefiniowany przez: • kąt widzenia (field of view) mierzony zwykle w pionie (fovy) • przednią i tylną płaszczyznę obcinania • stosunek szerokości do wysokości (aspect ratio) powierzchni (matrycy), na którą jest rzutowany obraz „postrzegany” przez kamerę Przekształcenie rzutowania (1)Ostrosłup widzenia

  12. Na podstawie parametrów ostrosłupa widzenia konstruowane jest przekształcenie rzutowania perspektywicznego. • Przekształcenie to najpierw sprowadza – przy użyciu macierzy rzutowania perspektywicznego - współrzędne wierzchołków w przestrzeni kamery do tzw. jednorodnej przestrzeni obcinania (homogeneous clip space, projectionspace), w której ma m.in. miejsce operacja obcinania wielokątów wzgl. bryły widzenia. • Następnie ma miejsce operacja dzielenia perspektywicznego współrzędnych wierzchołków, w wyniku której współrzędne te sprowadzane są do układu znormalizowanych współrzędnych urządzenia (NDC). Stosując standardową macierz rzutowania konkretnego API otrzymamy: • współrzędne x i y [-1, 1] • współrzędna z [-1, 1] w OpenGLoraz z[0, 1] w DirectX. Przekształcenie rzutowania (2)Znormalizowane współrzędne urządzenia Stały potok OpenGL i programowalny OpenGL 2.0 Stały potok DirectX

  13. W ostatniej fazie potoku przekształceń współrzędne wierzchołków przekształcane są przy wykorzystaniu transformacji widoku (viewporttransformation) w celu wyświetlenia we wskazanym „widoku” (viewport), tj. prostokątnym obszarze okna . Okno może posiadać kilka widoków (np. ukazujących obraz sceny z różnych kamer). DirectX 9 (DirectX 10 i 11 podobnie – funkcje RSSetViewports()interfejsów, odpowiednio, ID3D10Device i ID3D11DeviceContext Przekształcenie widoku OpenGL

  14. Podstawowe zasoby, które powinien obsługiwać renderer to: • geometria – wyrażana jest w języku wierzchołków i ich atrybutów (położenie, kolor, normalne, współrzędne tekstur, ...) i reprezentowana przez bufory wierzchołków i indeksów • współczynniki globalne materiałów – opisują globalne właściwości optyczne danej geometrii istotne z punktu widzenia interakcji ze światłem (współczynnik rozproszenia, współczynnik odbicia, etc.) • tekstury – opisują lokalne właściwości optyczne danej geometrii • shadery – definiują sposób działania programowalnych części potoku graficznego • stany renderingu (renderstates) – określają parametry i właściwości nieprogramowalnych części potoku graficznego, które można zmieniać (mieszanie i test alfa, włączanie i wyłączanie z-bufora, backfaceculling, ...) • Współczynniki globalne materiałów, tekstury, shadery i stany renderingu często wykorzystywane są łącznie do zdefiniowania materiału. • światła • kamery (i skojarzone z nimi widoki - viewports) • bufory renderingu (rendertargets) - bufor kolorów, z-bufor, bufor szablonu,... • czcionki • ... Podstawowe zasoby renderera

More Related