Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

XNA Oświetlenie Kurs ITA-106 (Grafika i multimedia) – Moduł 3 Jacek Matulewski (

Podobne prezentacje


Prezentacja na temat: "XNA Oświetlenie Kurs ITA-106 (Grafika i multimedia) – Moduł 3 Jacek Matulewski ("— Zapis prezentacji:

1 XNA Oświetlenie Kurs ITA-106 (Grafika i multimedia) – Moduł 3 Jacek Matulewski ( Wersja: 7 listopada 2009

2 Plan 1.Nowy typ werteksów VertexPositionColorNormal 2.Prostopadłościan – wektory normalne 3.Oświetlenie domyślne 4.Typy światła (model Phonga), własności materiału 5. Uśrednianie i interpolacja normalnych 6.Mieszanie kolorów – Antyaliasing – Problemy z przezroczystością – Mgła 7.Metoda rzutowania cieni

3 Projekt startowy Komponent Prostopadłościan Obroty macierzy świata w metodzie Game1.Update Macierz rzutowania: perspektywa Macierz widoku: kamera w (0,0,2.5) skierowana na początek układu współrzędnych Będziemy edytować wyłącznie metodę Game1.Initialize Projekt można pobrać z Plik zrodla/M03/3A1-0 Oswietlenie (teoria) - Start.zip

4 Nowy typ werteksu Werteks – wierzchołek figury 2D lub 3D, element siatki rozpiętej w 3D, która jest bazą renderowanej sceny Werteks nie jest po prostu punktem w przestrzeni 3D Z werteksem mogą być wiązane własności, m.in: - pozycja i kolor (VertexPositionColor), - normalna i wsp. Tekstury (VertexPositionNormalTexture) - głębokość, styczna, wielkość punktu, mgła, itd. W bibliotece XNA są tylko cztery klasy opisujące werteksy (VPC, VPCT, VPNT, VPT; my dodamy VPCN i VPCNT) 1/7

5 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace ITA106 { public struct VertexPositionColorNormal { } Nowy typ werteksu VC#: menu Project, Add class Dodajemy przestrzenie nazw XNA Klasę werteksu będziemy używać w kolejnych projektach Dodajemy przestrzenie nazw XNA Nazwa klasy w konwencji typów werteksów XNA 1/7

6 public struct VertexPositionColorNormal { public Vector3 Position; public Color Color; public Vector3 Normal; Nowy typ werteksu Pola przechowujące dane werteksu (własności) 1/7 public static readonly VertexElement[] VertexElements = new VertexElement[]{ public static int SizeInBytes = 6 * sizeof(float) + sizeof(uint); Rozmiar werteksu new VertexElement(0, 0, VertexElementFormat.Vector3, VertexElementMethod.Default, VertexElementUsage.Position, 0), Tablica opisująca elementy werteksu (własności) Numer strumienia (0 - domyślny)Numer bajtu w paczceW XNA Position jest typu Vector3 Metoda teselatoraSemantyka elementu (własności) werteksa Indeks semantyki (ma sens gdy zdefiniowane jest więcej semantyk) Pierwszy z trzech elementów werteksu ElementPozycjaTyp XNAInterpretacja Position0VertexElementFormat.Vector3VertexElementUsage.Position Color3 * sizeof(float)VertexElementFormat.ColorVertexElementUsage.Color Normal3 * sizeof(float) + sizeof(uint) VertexElementFormat.Vector3VertexElementUsage.Normal

7 public struct VertexPositionColorNormal { public Vector3 Position; public Color Color; public Vector3 Normal; … Nowy typ werteksu 1/7 public VertexPositionColorNormal(Vector3 position, Color color, Vector3 normal) { this.Position = position; this.Color = color; this.Normal = normal; this.TextureCoordinate = textureCoordinate; } } Konstruktor

8 public struct VertexPositionColorNormalTexture { public Vector3 Position; public Color Color; public Vector3 Normal; public Vector2 TextureCoordinate; public static int SizeInBytes = 8 * sizeof(float) + sizeof(uint); Nowy typ werteksu 1/7 ElementPozycjaTyp XNAInterpretacja Position0VertexElementFormat.Vector3VertexElementUsage.Position Color3 * sizeof(float)VertexElementFormat.ColorVertexElementUsage.Color Normal3 * sizeof(float) + sizeof(uint) VertexElementFormat.Vector3VertexElementUsage.Normal Texture Coordinate 6 * sizeof(float) + sizeof(uint) VertexElementFormat.Vector2VertexElementUsage. TextureCoordinate Ćwiczenie: zdefiniować typ werteksu uwzględniający element współrzędnych teksturowania public struct VertexPositionColorNormalTexture { public Vector3 Position; public Color Color; public Vector3 Normal; public ?????? TextureCoordinate; public static int SizeInBytes = ? * sizeof(float) + sizeof(uint);

9 Normalne w prostopadłościanie 2/7 W pliku Prostopadloscian.cs: Ctrl+H: zmiana VertexPositionColor (typ XNA) na VertexPositionColorNormal (nasz typ) VertexPositionColorNormal[] werteksy = new VertexPositionColorNormal[6*2*3]{ //przednia sciana new VertexPositionColorNormal(punkty[3], kolor1, Vector3.UnitZ), new VertexPositionColorNormal(punkty[2], kolor1, Vector3.UnitZ), … //gorna sciana new VertexPositionColorNormal(punkty[3], kolor2, Vector3.UnitY), np.

10 Oświetlenie domyślne 3/7 Wracamy do klasy gry Game1 (plik Game1.cs). W metodzie Game1.Initialize włączamy oświetlenie domyślne: efekt.EnableDefaultLighting(); efekt.AmbientLightColor = new Vector3(0.5f, 0.5f, 0.5f); efekt.AmbientLightColor = Color.Gray.ToVector3(); Kolor światła otoczenia (typ Vector3)

11 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 światła (model Phonga) 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 4/7

12 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 – model Lamberta (1760) Model cieniowania Phonga (coś innego niż model ośw.) = interpolacja normalnych (uśrednianie normalnych) 4/7

13 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 4/7

14 Model Lamberta Model światła rozproszonego Jasność przedmiotu (natężenie światła) równa jest I i. Jest ono jakąś funkcją natężenia światła padającego na powierzchnię i kąta odbicia (= padania) Model zakłada, że natężenie światła odbitego I d jest proporcjonalne do efektywnej powierzchni widzianej przez obserwatora Acos( ). I d = I i cos( ) Obliczanie cos( ) jest szybkie: cos( ) = N x L x +N y L y +N z L z N – wektor normalny, L – promień św. odbitego NL 4/7

15 Model Phonga Model światła specular (zajączek) Wprowadzony przez Phonga – nie ma podstaw fizycznych I s = I i cos n ( ) Parametr n kontroluje ostrość zależności od kąta pod którym oglądamy fragment powierzchni n = 1, 5, 10, 20, 50, 100 n ~ B..Effect.SpecularPower N – wektor normalny L – promień św. odbitego V – kierunek do obserwatora N L V 4/7

16 Ciało doskonale czarne Promiennik zupełny 4/7 Ustawiamy wszystkie parametry materiału na czerń W metodzie Game1.Initialize : efekt.EnableDefaultLighting(); efekt.AmbientLightColor = Color.Gray.ToVector3(); efekt.DiffuseColor = Color.Black.ToVector3(); efekt.SpecularColor = Color.Black.ToVector3(); efekt.EmissiveColor = Color.Black.ToVector3(); Materiał pochłania wszystkie typy światła (także otoczenia) efekt.DirectionalLight0.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight0.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight1.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight1.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight2.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight2.SpecularColor = Color.Black.ToVector3(); Wyłączamy wszystkie trzy źródła światła (pozostaje tylko światło otoczenia) Włączone światło otoczenia

17 Ciało białe matowe 4/7 Ustawiamy wszystkie parametry materiału na czerń W metodzie Game1.Initialize : efekt.EnableDefaultLighting(); efekt.AmbientLightColor = Color.Gray.ToVector3(); efekt.DiffuseColor = Color.White.ToVector3(); efekt.SpecularColor = Color.Black.ToVector3(); efekt.EmissiveColor = Color.Black.ToVector3(); efekt.DirectionalLight0.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight0.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight1.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight1.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight2.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight2.SpecularColor = Color.Black.ToVector3(); Tylko światło otoczenia, więc przedmiot jest płaski efekt.DirectionalLight0.DiffuseColor = Color.White.ToVector3(); efekt.DirectionalLight0.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight1.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight1.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight2.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight2.SpecularColor = Color.Black.ToVector3(); Włączamy komponent światła rozproszonego pierwszego źródła światła

18 efekt.DirectionalLight0.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight0.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight1.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight1.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight2.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight2.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight0.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight0.SpecularColor = Color.Red.ToVector3(); efekt.DirectionalLight1.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight1.SpecularColor = Color.Black.ToVector3(); efekt.DirectionalLight2.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight2.SpecularColor = Color.Black.ToVector3(); Czarny monolit z połyskiem 4/7 W metodzie Game1.Initialize : efekt.EnableDefaultLighting(); efekt.AmbientLightColor = Color.Gray.ToVector3(); efekt.DiffuseColor = Color.Black.ToVector3(); efekt.SpecularColor = Color.White.ToVector3(); efekt.EmissiveColor = Color.Black.ToVector3(); Włączamy tylko komponent rozbłysku pierwszego źródła światła efekt.SpecularPower = 1; = 16; = 128; n = 1 – jak światło rozproszone n = 16 – typowa wartość n = 128 – błysk tylko w osi Pochłaniamy światło rozproszone, a odbijamy rozbłysk (specular) Czarne ciało reagujące na światło typu rozbłysk

19 Wiele kolorowych reflektorów 4/7 W metodzie Game1.Initialize : efekt.EnableDefaultLighting(); efekt.AmbientLightColor = Color.Gray.ToVector3(); efekt.DiffuseColor = Color.Black.ToVector3(); efekt.SpecularColor = Color.White.ToVector3(); efekt.EmissiveColor = Color.Black.ToVector3(); efekt.DirectionalLight0.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight0.SpecularColor = Color.Red.ToVector3(); efekt.DirectionalLight1.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight1.SpecularColor = Color.Green.ToVector3(); efekt.DirectionalLight2.DiffuseColor = Color.Black.ToVector3(); efekt.DirectionalLight2.SpecularColor = Color.Blue.ToVector3(); efekt.SpecularPower = 16; Czarne ciało reagujące na światło typu rozbłysk

20 Wiele źródeł światła 4/7 W metodzie Game1.Initialize : efekt.EnableDefaultLighting(); efekt.AmbientLightColor = Color.Black.ToVector3(); efekt.DiffuseColor = Color.White.ToVector3(); efekt.SpecularColor = Color.Black.ToVector3(); efekt.EmissiveColor = Color.Black.ToVector3(); efekt.DirectionalLight0.DiffuseColor = Color.Red.ToVector3(); efekt.DirectionalLight0.SpecularColor = Color.Red.ToVector3(); efekt.DirectionalLight1.DiffuseColor = Color.Green.ToVector3(); efekt.DirectionalLight1.SpecularColor = Color.Green.ToVector3(); efekt.DirectionalLight2.DiffuseColor = Color.Blue.ToVector3(); efekt.DirectionalLight2.SpecularColor = Color.Blue.ToVector3(); Matowe ciało oświetlone trzema żarówkami

21 Światło emisji 4/7 W metodzie Game1.Initialize : efekt.EnableDefaultLighting(); efekt.AmbientLightColor = Color.Black.ToVector3(); efekt.DiffuseColor = Color.White.ToVector3(); efekt.SpecularColor = Color.Black.ToVector3(); efekt.EmissiveColor = Color.Yellow.ToVector3(); efekt.DirectionalLight0.DiffuseColor = Color.Red.ToVector3(); efekt.DirectionalLight0.SpecularColor = Color.Red.ToVector3(); efekt.DirectionalLight1.DiffuseColor = Color.Green.ToVector3(); efekt.DirectionalLight1.SpecularColor = Color.Green.ToVector3(); efekt.DirectionalLight2.DiffuseColor = Color.Blue.ToVector3(); efekt.DirectionalLight2.SpecularColor = Color.Blue.ToVector3(); Sześcienna żarówka (nie oświetla innych obiektów)

22 Cieniowanie Phonga 5/7 Uśrednianie i interpolacja normalnych Uśrednianie normalnychInterpolacja normalnych

23 Cieniowanie Phonga 5/7 Uśrednianie i interpolacja normalnych Cieniowanie płaskie Cieniowanie Phonga (ta sama ilość werteksów)

24 Mieszanie kolorów 6/7 Mieszanie kolorów (alpha blending), kanał alfa koloru Antyaliasing (realizowany sprzętowo) Przezroczystość Mgła

25 Projekt startowy Dwa nieprzezroczyste trójkąty Czerwony rysowany jest przed białym Obroty wokół osi OY Projekt można pobrać z Plik 3A3-0 Oswietlenie (teoria) - Mieszanie kolorow - Start.zip 6/7

26 Mieszanie kolorów 5/7 Antyaliasing (u mnie nie działa!!!!!) public Game1() { Window.Title = "Modul 3 - Oświetlenie - Mieszanie kolorów"; graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; graphics.PreferMultiSampling = true; graphics.PreparingDeviceSettings += new EventHandler (graphics_PreparingDeviceSettings); } void graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e) { e.GraphicsDeviceInformation.PresentationParameters.MultiSampleQuality = 0; e.GraphicsDeviceInformation.PresentationParameters.MultiSampleType = MultiSampleType.FourSamples; }

27 Mieszanie kolorów 5/7 Antyaliasing

28 Mieszanie kolorów 6/7 Kolejność rysowania trójkątów nie ma znaczenia Trójkąty nieprzezroczyste

29 Mieszanie kolorów 6/7 Włączanie blendingu protected override void Draw(GameTime gameTime) { GraphicsDevice gd = graphics.GraphicsDevice; gd.Clear(Color.Black); gd.RenderState.CullMode = CullMode.None; gd.VertexDeclaration = new VertexDeclaration( gd, VertexPositionColor.VertexElements); gd.RenderState.AlphaBlendEnable = true; gd.RenderState.SourceBlend = Blend.SourceAlpha; gd.RenderState.DestinationBlend = Blend.InverseSourceAlpha; gd.RenderState.BlendFunction = BlendFunction.Add; efekt.Begin(); … Funkcja mieszanie powinna być ustalona w metodzie Initialize

30 Mieszanie kolorów 6/7 Wyłączanie blendingu protected override void Draw(GameTime gameTime) { … pass.End(); } efekt.End(); gd.RenderState.AlphaBlendEnable = false; base.Draw(gameTime); } Po wyłączeniu blendingu kolejne przedmioty będą nieprzezroczyste bez względu na wartość alfa ich kolorów

31 Mieszanie kolorów 6/7 Zmiana kanału alfa kolorów trójkątu private VertexPositionColor[] werteksy = new VertexPositionColor[6]{ //trojkat czerwony new VertexPositionColor(new Vector3(1, -1, -0.1f), kolor1), new VertexPositionColor(new Vector3(-1, -1, -0.1f), kolor1), new VertexPositionColor(new Vector3(0, 1, -0.1f), kolor1), //trojkat bialy new VertexPositionColor(new Vector3(1, -1, 0.1f), kolor2), new VertexPositionColor(new Vector3(-1, -1, 0.1f), kolor2), new VertexPositionColor(new Vector3(0, 1, 0.1f), kolor2)}; static Color kolor1 = new Color(Color.Red, 128); static Color kolor2 = new Color(Color.White, 128); static Color kolor1 = Color.Red; static Color kolor2 = Color.White;

32 Mieszanie kolorów 6/7 Pierwszy rysowany jest trójkąt czerwony, po nim biały Trójkąty przezroczyste Gdy bliżej jest trójkąt biały: 1)Kolor trójkąta czerwonego jest ciemniejszy ze względu na tło. 2)Jego obraz przekazywany jest do bufora głębi 3)Kolor trójkąta białego mieszany jest z czerwonym, co daje różowy 4)Test głębi (odległość od kamery): biały < czerwony 5)Rysowany jest biały (różowy) Gdy bliżej jest trójkąt czerwony: 1)Kolor trójkąta czerwonego jest ciemniejszy ze względu na tło. 2)Jego obraz przekazywany jest do bufora głębi 3)Kolor trójkąta białego mieszany jest z czerwonym, co daje różowy 4)Test głębi (odległość od kamery): czerwony < biały 5)Rysowany jest czerwony (ciemny), który nie jest zmieszany z białym bo był renderowany wcześniej

33 Mieszanie kolorów 6/7 Zmiana kolejności nie rozwiązuje problemu: Trójkąty przezroczyste w odwróconej kolejności

34 Mieszanie kolorów 6/7 Wyłączenie bufora głębii i mieszanie sumujące: Proste pseudo-rozwiązanie problemu gd.RenderState.DepthBufferEnable = false; gd.RenderState.DestinationBlend = Blend.One;

35 Mieszanie kolorów 6/7 Sortowanie obiektów przezroczystych Poprawne rozwiązanie problemu przezroczystości Zamiast tego odczytamy w metodzie Game1.Draw bieżący kąt obrotu z macierzy świata efekt.World. Moglibyśmy zdefiniować pole klasy Game1, które przechowywałoby kąt obrotu aktualizowane w metodzie Game1.Update. Do rozebrania macierzy na części służy metoda Matrix.Decompose: public bool Decompose ( out Vector3 scale, out Quaternion rotation, out Vector3 translation ) Do rozebrania macierzy na części służy metoda Matrix.Decompose: public bool Decompose ( out Vector3 scale, out Quaternion rotation, out Vector3 translation ) Do rozebrania macierzy na części służy metoda Matrix.Decompose: Vector3 skalowanie, translacja; Quaternion obrot; efekt.World.Decompose(out skalowanie, out obrot, out translacja); double katObrotu = 2 * Math.Acos(obrot.W); Dygresja o kwaternionach Kwaterniony to czwórki liczb analogiczne do liczb zespolonych q = ix+jy+kz+w = (x, y, z, w) Dobrze nadają się do opisu obrotów Jeżeli to kąt obrotu wokół osi (x, y, z), to kwaternion: q = (sx, sy, sz, c), gdzie s = sin( /2), c = cos( /2) Mając kwaternion możemy łatwo obliczyć kąt obrotu: = 2 arccos(w) Wstawić do metody Game1.Draw!

36 Mieszanie kolorów 6/7 W pętli rysowania w metodzie Game1.Draw: Poprawne rozwiązanie problemu przezroczystości if (katObrotu > -MathHelper.PiOver2 && katObrotu < MathHelper.PiOver2) { //czerwony, bialy gd.DrawUserPrimitives (PrimitiveType.TriangleList, werteksy, 0, 1); gd.DrawUserPrimitives (PrimitiveType.TriangleList, werteksy, 3, 1); } else { //bialy, czerwony gd.DrawUserPrimitives (PrimitiveType.TriangleList, werteksy, 3, 1); gd.DrawUserPrimitives (PrimitiveType.TriangleList, werteksy, 0, 1); }

37 Mieszanie kolorów 6/7 Sortowanie obiektów przezroczystych Poprawne rozwiązanie problemu przezroczystości

38 Mieszanie kolorów 6/7 Do Game1.Initialize dodajmy: Mgła efekt.FogStart = 0.2f; efekt.FogEnd = 20; efekt.FogColor = Color.White.ToVector3(); efekt.FogEnabled = true; Można manipulować położeniem kamery, aby zobaczyć efekt mgły (im dalej, tym bielszy). Efekt nie dotyczy przestrzeni (mgła zmienia tylko kolor brył)

39 Mieszanie kolorów 6/7 Korytarz zbudowany z sześcianu (odwrócony CullMode) Mgła

40 Rzutowanie cieni 7/7 Dlaczego w XNA, DirectX i OpenGL nie ma wbudowanego algorytmu generowania cieni? Popularne techniki generowania cieni: – Cienie rzutowane na płaszczyznę (plane projected shadows) – Odwzorowywanie cieni (shadow mapping) – Cienie objętościowe (volumetric shadows) Miękkie cienie: –http://graphics.cs.lth.se/research/shadows/ Rzutowanie cieni na płaszczyznę Shadow mapping Cienie objętościowe SzybkośćTak Nie DokładnośćTakZależy od jakości tekstury Tak Cienie własneNieTak Odbiorcy cieniaNieTak

41 Projekt startowy Obracający się sześcian i płaskie podłoże Oba obiekty zbudowane z komponentów Prostopadloscian Domyślne źródło światła (nr 0) w kierunku (1,1,1) Projekt można pobrać z Plik 3A5-0 Oswietlenie (teoria) - Rzutowanie cieni – Start.zip 6/7

42 Rzutowanie cieni 7/7 Tu powinien znaleźć się cień sześcianu Źródło światła (efekt.DirectionalLight0)

43 Rzutowanie cieni 7/7 Uproszczenie: źródło światła w nieskończoności Tu powinien znaleźć się cień sześcianu

44 Rzutowanie cieni 7/7 Metoda rzutowania cieni polega na ponownym narysowaniu obiektu rzutującego cień, ale spłaszczonego i w ciemnym kolorze. Macierz rzutowania punktu na płaszczyznę XNA oferuje tylko macierz rzutowania równoległego Matrix.CreateShadow Obiekt 3D, ale jego wszystkie werteksy w jednej płaszczyźnie

45 Rzutowanie cieni 7/7 Zalety metody rzutowania cieni (plane projected shadows) – prostota i szybkość (dwa przebiegi) – można jej używać zarówno z modelami, jak i funkcjami rysującymi obiekty – dokładność odwzorowania (każdy piksel) Zasadnicza wada: ograniczenie do płaskiego podłoża (np. wyścigi samochodowe)

46 3. W metodzie Game1.Update spłaszczamy go: efekt.World *= obroty szescian.World = efekt.World; cienSzescianu.World = efekt.World * Matrix.CreateShadow(new Vector3(1,1,1), new Plane(Vector3.Up,1.70f)); efekt.World *= obroty szescian.World = efekt.World; cienSzescianu.World = efekt.World * Matrix.CreateShadow(new Vector3(1,1,1), new Plane(Vector3.Up,1.6999f)); Rzutowanie cieni 7/7 1. Deklarujemy referencję do instancji komponentu: private Prostopadloscian cienSzescianu; 2. W metodzie Game1.Initialize tworzymy komponent, i rejestrujemy go: cienSzescianu = new Prostopadloscian(this,efekt,1,1,1,Color.Black); this.Components.Add(cienSzescianu); Trzeba wyłączyć cieniowanie cienia W naszym projekcie nie można wyłączyć bufora głębi

47 Rzutowanie cieni 7/7 4. Tworzymy nowy efekt dla cienia i wyłączamy światło: BasicEffect efektCienia = (BasicEffect)efekt.Clone(graphics.GraphicsDevice); efektCienia.DirectionalLight0.DiffuseColor = Color.Black.ToVector3(); efektCienia.DirectionalLight0.SpecularColor = Color.Black.ToVector3(); cienSzescianu = new Prostopadloscian(this,efektCienia,1,1,1,Color.Black); this.Components.Add(cienSzescianu); BasicEffect efektCienia = (BasicEffect)efekt.Clone(graphics.GraphicsDevice); efektCienia.DirectionalLight0.DiffuseColor = Color.Black.ToVector3(); efektCienia.DirectionalLight0.SpecularColor = Color.Black.ToVector3(); cienSzescianu = new Prostopadloscian(this,efektCienia,1,1,1,Color.DarkGreen); this.Components.Add(cienSzescianu);


Pobierz ppt "XNA Oświetlenie Kurs ITA-106 (Grafika i multimedia) – Moduł 3 Jacek Matulewski ("

Podobne prezentacje


Reklamy Google