310 likes | 545 Views
Jacek Matulewski (e-mail: jacek@fizyka.umk.pl ) ZMK, Instytut Fizyki, WFAiIS, UMK. XNA 4.0 Wprowadzenie do grafiki 3D. 28 stycznia 2012. Zapowiedź. Sentymentalne wspomnienia o historii grafiki 3D Kilka pojęć grafiki 3D: werteks, model Phonga, efekty Wprowadzenie do XNA
E N D
Jacek Matulewski (e-mail: jacek@fizyka.umk.pl) ZMK, Instytut Fizyki, WFAiIS, UMK XNA 4.0Wprowadzenie do grafiki 3D 28 stycznia 2012
Zapowiedź • Sentymentalne wspomnienia o historii grafiki 3D • Kilka pojęć grafiki 3D: werteks, model Phonga, efekty • Wprowadzenie do XNA • Co nowego w XNA 4.0?
Historia grafiki • 1960s – projektowanie komp. (Boeing, Peugot, Renault) • 1970s – pojawiają się PC, pierwsze gry 2D, SIGGRAPH • 1980s – Amiga, gry 2D stają się powszechne, SGI (GL), Luxo Jr. (1986), Flight Simulator (1982-2006) • 1990s – OpenGL (1992), Wolfenstein 3-D (1992), Doom (1993), DirectX w Windows 95 (1994),Voodoo (1996), Quake (1996), Unreal (1998),Toy Story (1996) z Pixar (dawniej w IL&M) • 2000s – Shrek (2001) i inne => śmierć kreskówkiDirectX 9.0c (2004) => gry 3D są powszechne Managed DirectX (MDX, 2002), XNA (2006)
Historia grafiki 1992, id Software
Historia grafiki Quake (1996) Quake II (1997) Quake III Arena (1999) Quake 4 (2005) Źródło: http://www.club3d.nl/index.php/thema/subject/index/6
Historia grafiki Tron (1982) – Disney Luxo, Jr (1986) – Pixar Toy Story (1996) – Pixar Shrek (2001) Dreamworks
XNA Idea 1: dostęp do Direct3D i DirectDraw z języków .NET Idea 2: przenośność (PC z Windows, Xbox 360, WP7, Zune) skupienie na grze, a nie na platformie sprzętowej Idea 3: pełne wykorzystanie obecnych kart graficznych (programowalne jednostki kart graficznych)
Architektura XNA edytor, debuger, IntelliSense (IDE) Framework Matrix, Vector3 klasy opakow. DX GC, VC# wątki (TPL), IO DirectXGamepad Źródło: Mitch Walker, prezentacja na Gamefest 2008
Prymitywy Podstawowe pojęcia grafiki 3D: • Prymityw – figura zbudowane z werteksów, dwustronna Prim..Type.TriangleList Pri..Type.TriangleStrip Prim..Type.TriangleFan PrimitiveType.PointList PrimitiveType.LineList PrimitiveType.LineStrip zbiór wierzchołków inna jest ilość werteksów używanych do narysowania linii i ciągu linii Brakuje czworokątów (quad) i wielokątów – trzeba je samodzielnie budować z trójkątów
Aplikacja XNA Strumień werteksów Shader werteksów Współrzędne werteksów w układzie ekranu Kolor, normalne, współrzędne tekstury Rasteryzator Interpolator Shader pikseli Test bufora głębi Bufor ramki Monitor Potok Geometry shader? Strumieńpikseli
Profile (XNA 4.0) Zbiór cech charakteryzujących karty graficzne, ich możliwości wyświetlania (nie ma już diagnostyki).Upraszcza tworzenie projektów przenaszalnychi na platformy o zunifikowanych specyfikacjach. poza WP7
Efekt (klasa Effect i BasicEffect) Klasa reprezentująca Pixel i VertexShadery w kodzie C#. Dostęp do własności wyświetlania (GraphicDevice). Bez przygotowywania własnych shaderów można używać klasy BasicEffect (we wszystkich wersjach XNA): • macierze świata i widoku: własności World i View • macierz rzutowania: własność Projection • domyślne oświetlenie: DirectionalLight0-2, światło tła + efekt mgła (nie można zmieniać położenia źródeł św.) • teksturowanie: własność Texture
Nowe efekty w XNA 4.0 • DualTextureEffect – nałożenie dwóch tekstur • EnvironmentMapEffect – mapowanie środowiskowena bazie kubicznej tekstury (użytej też do skyboxa).Dodatkowo: jej kanał alpha to obraz świateł rozbłysku. • AlphaTestEffect – kanał alfa używany jako „zamiennik” testu głębokości (raczej w 2D).Piksele nie są rysowane tam, gdzie A < ustalony próg • SkinnedEffect –rigging i skinning modeli • IEffectMatrices, IEffectLights (3), IEffectFog Wszystkie efekty są konfigurowalne (jak BasicEffect)
EnvironmentMapEffect • Tekstura kubiczna http://blogs.msdn.com/b/shawnhar/archive/2010/08/09/environmentmapeffect.aspx
EnvironmentMapEffect http://blogs.msdn.com/b/shawnhar/archive/2010/08/09/environmentmapeffect.aspx
DualTextureEffect output.rgb = Texture1.rgb * Texture2.rgb * 2; output.a = Texture1.a * Texture2.a; http://blogs.msdn.com/b/shawnhar/archive/2010/08/04/dualtextureeffect.aspx
Wbudowane obiekty stanów Wcześniej umieszczone w GraphicsDevice(teraz nie można ich tam edytować) Wbudowane stany: • RasterizedState (por. nieistniejący już RenderState)odpowiada za potok renderowania (m.in. CullMode). • DepthStencilState – test głębokości i test szablonowy • BlendState – blending, mieszanie kolorów (przezrocz.) • SamplerState – reprezentuje próbnik (sampler) tekstury
Konwersja z XNA 3.x do 4.0 • Typowa postać metody Draw (XNA 3.0) protected override void Draw(GameTime gameTime) { GraphicsDevice gd = graphics.GraphicsDevice; gd.Clear(Color.Black); gd.RenderState.CullMode=CullMode.None; gd.Vertices[0].SetSource(buforWerteksowTrojkata,0,VertexPositionColor.SizeInBytes); gd.VertexDeclaration = new VertexDeclaration(gd, VertexPositionColor.VertexElements); efekt.Begin(); foreach (EffectPass pass in efekt.CurrentTechnique.Passes) { pass.Begin(); gd.DrawPrimitives(PrimitiveType.TriangleList, 0, 1); pass.End(); } efekt.End(); base.Draw(gameTime); } pass.Apply(); gd.RasterizerState = RasterizerState.CullNone; gd.SetVertexBuffer(buforWerteksowTrojkata);
Transformacje Podstawowe pojęcia grafiki 3D: • Transformacje – określane we współrzędnych sceny 3Dtranslacja (Matrix.CreateTranslation, macierz 4x4!), obrót (Matrix.CreateRotationXYZ, z osi obrotu i kąta, yaw+pitch+roll, klasa Quaternion)skalowanie (Matrix.CreateScale), pochyleniezłożenie – dowolna macierz 4x4 (Matrix.Multiply) • Rozdzielenie macierzy świata i widoku (wygoda!) • Transformacje są wykonywane „od końca”(post-multiplication)
Transformacje • We współrzędnych kartezjańskich (2D) obrót i translacja mogą być zapisane: • We współrzędnych jednorodnych: Wprowadzone w 1946 przez E. Maxwella (rzutowanie). W 1965 L. Roberts użył ich do zunifikowania zapisu wszystkich transformacji: obrotów, translacji, skalowanie i pochylania + rzutowania.
Światło (cieniowanie) Fizyczny model oświetlenia – na efekt końcowy (tj. kolor piksela) wpływają „własności emisyjne” źródła światła, „własności absorpcyjne” materiału, który jest oświetlany i własności ewentualnych ciał półprzezroczystych + + = • Typy źródeł oświetlenia: • Światło otoczenia (ambient) – bez źródła i kierunku – rozświetla jednorodnie całą scenę, także wewnątrz figur) – nie daje cieni na obiekcie (nie ma złudzenia 3D) • Typy źródeł oświetlenia: • Światło otoczenia (ambient) • Rozproszone (diffuse) – posiada źródło, ale jest jednorodne we wszystkich kierunkach • Generalnie: Jasność proporcjonalna do kosinusa kąta padania (normalna) • Typy źródeł oświetlenia: • Światło otoczenia (ambient) • Rozproszone (diffuse) • Rozbłysk (specular) – źródło i kierunek • reflektor, efekt „zajączka” – rozbłysku na gładkich pow. • Typy źródeł oświetlenia: • Światło otoczenia (ambient) – światło słoneczne w białym pomieszczeniu • Rozproszone (diffuse) – mleczna żarówka, świeca • Rozbłysk (specular) – reflektor, odbicie od lustra • Dla każdego typu parametry materiału ustalane są osobno
Model oświetlenia Phonga + + = • Opracowany w 1975 przez Phong Bui-Tuonga • Jest jedynie zgrubnym przybliżeniem praw optyki • Zakłada trzy niezależne komponenty odbitego światła • Światło rozproszone – prawo Lamberta (1760) • Model cieniowania Phonga (coś innego niż model ośw.) = interpolacja normalnych (uśrednianie normalnych)
Model oświetlenia Phonga + + = • W XNA i Direct3D model Phonga jest uzupełniony o światło emisji (emission) • Imitacja źródła światła (jednak nie oświetla innych aktorów na scenie!) • Realizowane podobnie jak światło otoczenia
Czego potrzebujemy… • Karta graficzna zgodna z DirectX 9.0/10.0 (Shader 2.0) • Visual Studio 2010 lub Visual C# 2010 Express • Platforma .NET 4.0 (instalowana razem z VS/VC#) • Windows Phone 7 Developer Tools zawiera XNA 4.0 • XNA Game Studio 4.0 • NVidia FX Composer 2.5 – narzędzie bardzo pomocnedo programowania shaderów
Czego nie musimy… • Znać algorytmów cieniowania (shading), chyba, że programujemy procesory strumieniowe • Zajmować się algorytmami kreślenia linii z pikseli • (programowaniem antyaliasingu, itp.) • Algorytmy optymalnego rysowania trójkątów, • zapełniania wielokątów, rysowania krzywych • Usuwać niewidocznych na scenie werteksów, • powierzchni przesłoniętych przez innych aktorów To robią karty graficzne i biblioteka XNA!
Nie musimy także… • Znać algebry wektorów i macierzy (Vector34, Matrix)(w tym macierz translacji, obrotu, rzutowania itd.) • Tworzyć pętli głównej, dbać o timery inicjującerenderowanie sceny i „odświeżanie” logiki aplikacji • Wiedzieć, czym są współrzędne jednorodne, w których pracują karty graficzne • Obsługiwać sterowników urządzeń wejścia (sterowników gier) i wyjścia (karty dźwiękowej) To robią biblioteki platformy XNA!
Co musimy zrobić sami… • Cienie rzucane na podłoże i inne przedmioty rzutowanie cieni, shadow mapping, volumetric shadows • Fizyka: rozwiązywanie równań ruchu, detekcja kolizji są biblioteki komercyjne i rozwiązania sprzętowe (GPU) • Wszelkie odstępstwa od domyślnego oświetleniai teksturowania wymagają programowania shaderów(w tym już zmiana pozycji źródeł światła) • Programowanie logiki w C# 4.0Zaplecze w XNA 4.0: .NET Framework 4.0 (TPL)
XNA 4.0 + .NET 4.0 • Ciekawe nowości w .NET 4.0: • TPL (Parallel Extensions)np. zrównoleglenie silnika fizyki • MEF – zarządzanie wtyczkami (plugins) • System.Numerics.Complex, BigInteger • Lazy<>, argumenty domyślne • Dynamic (DLR)