Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group

Ähnliche Präsentationen


Präsentation zum Thema: "Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group"—  Präsentation transkript:

1 Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group

2 Agenda GDI+ 3D-Grafik Schlußbemerkung

3 Agenda GDI+ Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung

4 Das Historische Erlebnis DOS Welcher Grafikkartentyp, welcher Grafikmode, was sind Latchregister, reich mir mal das Programmierhandbuch des Druckerherstellers, gibt es einen schnelleren Integer- Algorithmus, hats einen 387 oder 287, Postscript!, Prescribe… Windows GDI HDC, SelectObject, ReleaseDC, SelectPalette,… Windows GDI+ Graphics g; g.DrawLine(..); g.RotateTransform(30) Gibts ja auch noch: OpenGL, GAPI, Direct3D, DirectDraw,… Und sowieso - ist Grafik nicht etwas, das es zu beschreiben gilt, anstatt APIs und Methodenaufrufe zu initiieren?

5 GDI+ Verfügbarkeit Windows XP: ja. Win98, WinME, NT4SP6, Win2K: als Add-On.NET Framework: kein Ausweg!

6 Agenda GDI+ Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung

7 Unterschiede zu GDI Graphics-Objekt statt DC Pens, Brushes,… sind unabhängig vom Graphics-Objekt (Parameter statt selektiertes Objekt) Koordinatentransformationen (endlich nicht mehr selbst zu programmieren) Keine Current Position Alpha-Blending (Transparenz) Farbverläufe Imaging (JPEG etc.)

8 Agenda GDI+ Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung

9 Demo: Minimal Graphics-Objekt private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; } private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; } // auch: Graphics g = this.button1.CreateGraphics(); // auch: Graphics g = this.button1.CreateGraphics();

10 GDI+ und PrgSprachen.NET WinForm-Projekte C++ Windows-Apps #include #include // link: GDIPLUS.LIB using namespace Gdiplus; VOID OnPaint(HDC hdc) { Graphics graphics(hdc); Pen pen(Color(255, 0, 0, 255)); graphics.DrawLine(&pen, 0, 0, 200, 100); }

11 Agenda GDI+ Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung

12 Demo: BuildingBlocks Lines Rectangles Ellipses Arcs Polygons Cardinal Splines Wie mit biegsamem Linieal gezogene Linie Bézier splines Start-, Endpunkt und zwei magnetische Punkte in der Ferne

13 Agenda GDI+ Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung

14 Koordinatensysteme Page World Beliebig positionier-, rotier- und skalierbar Transfomationsmatrix speichert die Welttransformation Ursprung links oben Default: Pixel-Einheit, aber änderbar PageUnits (z.B. auf 2,54 cm umstellbar, DpiX, DpiY sind abfragbar – Größe der Grafikkarte;-)) PageScale zusätzlich für andere Auflösungseinheiten Device Ursprung links oben Pixel als Einheit

15 Trafomatrix 3x3 – Matrix speichert gesamte Folge von Trafos (Translation, Rotation, Skalierung) Matrix Representation of Transformations (.NET Framework Developer's Guide )

16 Demo: Trafo g.Transform die Trafo-Matrix g.TranslateTransform (dx,dy) g.ScaleTransform (xMult, yMult) z.B: immer 1000*1000- Koordinatensystem (Egalisieren von Fenster, Drucker,…) z.B: Ursprung in Mitte des Fensters setzen g.RotateTransform (30) z.B: y-Werte nach oben wachsend Pen-Breite ist in Weltkoordinaten z.B. Auflösung auf DINA4-mm stellen und dann Pen in mm

17 Demo: Bewegung Dito: Drawing ändert sich nicht, aber das Koordinatensystem (der Betrachter)

18 Double Buffering Zappelfrei bei bewegter Darstellung private void FormMain_Load(…) { this.SetStyle( ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true ); } private void FormMain_Load(…) { this.SetStyle( ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true ); } DoubleBuffer Bild wird im Hintergrund aufgebaut AllPaintingInWmPaint WM_ERASEBKGND führt noch nicht zum Löschen des Fensters UserPaint OS führt kein Caching des Inhalts aus. Bei schnellen Bewegungen wäre das unnötig.

19 Demo: ObjMover Objekte, rotierbar und verschiebbar Anklicken eines Objekts erkennen Flicker-freie Darstellung

20 Demo: BenchLines In GDI+ wird jeder Punkt über die Koordinatentransformation geschickt Hier: Extrembeispiel Treppenstufen mit 3 Pixel langen Linien Das ist der Preis für den Komfort! Anmerkung: zeitaufwendige Grafik sollte den UI-Thread nicht blockieren…

21 Agenda GDI+ Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung

22 Standarddrucker (GDI) GDI (ohne +) PRINTDLG pdlg; // Init memset( &pdlg, 0, sizeof( PRINTDLG ) ); pdlg.lStructSize = sizeof( PRINTDLG ); // Flag: ich möchte DC pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC; // Kein Show! PrintDlg( &pdlg ); // Da ist er: DC pdlg.hDC; PRINTDLG pdlg; // Init memset( &pdlg, 0, sizeof( PRINTDLG ) ); pdlg.lStructSize = sizeof( PRINTDLG ); // Flag: ich möchte DC pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC; // Kein Show! PrintDlg( &pdlg ); // Da ist er: DC pdlg.hDC;..und nun gleich wieder vergessen!

23 Drucker wählen Standarddrucker PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); MessageBox.Show ( dlg.PrinterSettings.PrinterName ); PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); MessageBox.Show ( dlg.PrinterSettings.PrinterName ); Druckerwahl PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); if( dlg.ShowDialog()==DialogResult.OK) MessageBox.Show ( dlg.PrinterSettings.PrinterName ); PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); if( dlg.ShowDialog()==DialogResult.OK) MessageBox.Show ( dlg.PrinterSettings.PrinterName );.NET: PrintDialog liefert Druckerinfos, kein Graphics-Objekt

24 Standarddrucker (.NET) PrintDocument, PrintPageEventHandler PrintDocument doc = new PrintDocument(); // Default Printer doc.PrintPage += new PrintPageEventHandler(MyPrintFunc); doc.Print();// Empfehlenswert: try-catch-Szenario void MyPrintFunc (object sender, PrintPageEventArgs e) { // nutze e.Graphics e.HasMorePages = false; } PrintDocument doc = new PrintDocument(); // Default Printer doc.PrintPage += new PrintPageEventHandler(MyPrintFunc); doc.Print();// Empfehlenswert: try-catch-Szenario void MyPrintFunc (object sender, PrintPageEventArgs e) { // nutze e.Graphics e.HasMorePages = false; } PrintDocument PrintPageEventHandler

25 Print mit Druckerwahl PrintDialog, PrintDocument, MyFunc PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler( MyPrintFunc ); PrintDialog dlg = new PrintDialog(); dlg.Document = doc; if (dlg.ShowDialog() == DialogResult.OK) doc.Print(); // void MyPrintFunc (object sender, PrintPageEventArgs e) { //... } PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler( MyPrintFunc ); PrintDialog dlg = new PrintDialog(); dlg.Document = doc; if (dlg.ShowDialog() == DialogResult.OK) doc.Print(); // void MyPrintFunc (object sender, PrintPageEventArgs e) { //... }

26 Print Preview PrintPreviewDialog PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler( MyPrintFunc ); PrintPreviewDialog dlg = new PrintPreviewDialog(); dlg.Document = doc; dlg.ShowDialog(); // void MyPrintFunc (object sender, PrintPageEventArgs e) { //... } PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler( MyPrintFunc ); PrintPreviewDialog dlg = new PrintPreviewDialog(); dlg.Document = doc; dlg.ShowDialog(); // void MyPrintFunc (object sender, PrintPageEventArgs e) { //... }

27 Demo: Printing Print! Print… Print Preview

28 Agenda GDI+ Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung

29 Demo: Images Bitmaps (JPG, GIF, BMP) Metafiles (EMF) (Demo: ObjMover) Bitmap bitmap = new Bitmap("Grapes.jpg"); e.Graphics.DrawImage(bitmap, 60, 10); Metafile metafile = new Metafile("SampleMetafile.emf"); e.Graphics.DrawImage(metafile, 60, 10); Bitmap bitmap = new Bitmap("Grapes.jpg"); e.Graphics.DrawImage(bitmap, 60, 10); Metafile metafile = new Metafile("SampleMetafile.emf"); e.Graphics.DrawImage(metafile, 60, 10);

30 Agenda GDI+ 3D-Grafik OpenGL Direct3D Schlußbemerkung

31 Hinter den Bergen… Arbeit Funktionen Mathe IdeeIdee ProgrammProgramm Verstehen der/einer Grafikbibliothek Programmrahmen Einige grundlegende Features

32 OpenGL vs. Direct3D OpenGL OpenGL, Direct3D Direct3D Ähnliche Features Von Hardware beschleunigt In.NET nutzbar Standard von Silicon Graphics Das rote Buch: Addison-Wesley, OpenGL Programming Guide © Silicon Graphics, Inc ) Gut sichtbare Grundfunktionalität SDK bringt neuen Projekttyp ins VS.NET - derzeit nicht in Everette Beta;-( Objektklassen Schnell und gut für Spiele Nur Windows-Plattform

33 Agenda GDI+ 3D-Grafik OpenGL Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung

34 OpenGL als Standard Plattformunabhängig OpenGL (TM) Architectural Review Board Unix, NT, Win95... Echtzeitgrafik schnelle Algorithmen, kein Raytracing

35 Funktionsgruppen Wiggle - Funktionen (MS) Core Set - Funktionen gl wgl Win32 - Funktionen (MS) ohne glu aux Präfix Utility - Funktionen Auxiliary - Funktionen

36 Datentypen OpenGL.NETKennung GLbyteSByteb GLintInt32i GLenumUInt32ui GLfloatSinglef GLdoubleDoubled (Array)v... OpenGL.NETKennung GLbyteSByteb GLintInt32i GLenumUInt32ui GLfloatSinglef GLdoubleDoubled (Array)v....NET z.B. System.Int32 (unabh. Von Programmiersprache)

37 Funktionsnamen API-Präfix Parametertyp-Postfix Name (falls versch. Versionen) Beispiel glVertex3dvCore Set API Vertex-Funktion 3 double-Werte als Array void glVertex3dv( double[] v); glVertex3dvCore Set API Vertex-Funktion 3 double-Werte als Array void glVertex3dv( double[] v); --> Online Hilfe: z.B. glVertex, glGet

38 Rendering Context Color Buffer ( DC ) Color Buffer ( DC ) Depth Buffer (z-Buffer) Depth Buffer (z-Buffer) sonstige Puffer sonstige Puffer x,yx,yx,y Frame Buffer 3D-Programmierung RENDERINGCONTEXT Einstellungen (Licht...)

39 OpenGL unter.NET Noch kein offizielles MS-Assembly Verschiedenes im Internet: GLSharp (http://www.headbits.com/)http://www.headbits.com/ CsGL (http://sourceforge.net/projects/csgl)http://sourceforge.net/projects/csgl … Tatsächlich benötigt Deklarationen der OpenGL-Funktionen und Datentypen Aux-Funktionen über DLL statt statischer native Code Library Hilfe für RC-Benutzung Altbekannte OpenGL-Programmierung in.NET-Apps – kaum Unterschied zu SDK-Apps

40 Agenda GDI+ 3D-Grafik OpenGL Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung

41 Koordinatensystem Y -Z X Daumen Zeigefinger Mittelfinger +z Rechtssystem rechte Hand-Regel

42 Welt-, Modellkoordinaten Y -Z X WC MC Y -Z X Modellkoordinaten (Arbeitskoordinaten) Weltkoordinatensystem (immer fix)

43 Transformationen Rotation (Drehen) Translation (Verschieben) Skalierung (Dehnen/Stauchen) glTranslate glRotate glScale MC für Objektausgabe vorbereiten

44 Aux-Objekte auxSolidTeapotTeekessel auxWireTeapot-- Drahtmodell auxSolidCubeWürfel auxWireCube-- Drahtmodell... Anmerkung: Aux-Funktionen heißen in GLSharp glut-Funktionen.

45 Demo: Transformations.NET-Rahmen static void Paint () { glTranslated (0,0,-5); glRotated (30,0,0,1); glRotated (20,1,0,0); Aux.WireTeapot (1.0); } static void Paint () { glTranslated (0,0,-5); glRotated (30,0,0,1); glRotated (20,1,0,0); Aux.WireTeapot (1.0); } Transformations ShowThis.cs Form1.cs

46 Demo: MoveMC MoveMC Tastatur-Steuerung MoveMC.exe

47 Voreinstellungen Sichtbereich im WC Geräte-Ausgabebereich Y X -Z Window glFrustum / gluPerspective glViewport

48 Sichtbarer Bereich Sichtbereich im WC Y X -Z glFrustum / gluPerspective glMatrixMode ( GL_PROJECTION); glFrustum ( links, rechts, unten, oben, zStart, zEnde ); glMatrixMode ( GL_PROJECTION); gluPerspective ( öffnungWinkel, y_zu_x_Aspect, zStart, zEnde ); Oder:

49 Geräte-Ausgabebereich Y X -Z Window glViewport ( 0,0, windowWidth, windowHeight); Geräte-Ausgabebereich glViewport

50 Trafo-Pipeline Y X -Z MC 1 Window Object Coordinates (MC) Eye Coordinates (WC) Windows Coordinates Clip Coordinates (Fläche) Modelview Trafo Projection Trafo Viewport Trafo

51 Wo sind die Trafo-Infos? Modelview Trafo Projection Trafo Viewport Trafo Modelview Matrix Projection Matrix x,y, width, height Matrix: mathematische Datenstruktur, die alle Tranformationenseinstellungen speichert

52 Zugriff auf Einstellungen Modelview Trafo Projection Trafo Viewport Trafo glMatrixMode (GL_MODELVIEW) glLoadIdentity, glTranslated, glRotated, glScaled,... glMatrixMode (GL_PROJECTION) glLoadIdentity, glFrustum,... glViewport Aktuellen Einstellung zählen --> glLoadItentity wirkt im aktuellen Matrixmode OpenGL als State Machine Abfrage über glGet GL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX, GL_VIEWPORT Zwischenspeichern glPushMatrix(), glPopMatrix() Abfrage über glGet GL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX, GL_VIEWPORT Zwischenspeichern glPushMatrix(), glPopMatrix()

53 Demo: SDK_Minimal Create Size Paint CreateWindowDC bekommen SetPixelFormatDC vorbereiten wglCreateContextRC erzeugen glViewportAusgabebereich glFrustumSichtbereich glClearFrame Buffer löschen glTranslated...MC transformieren auxSolidTeapot...Objekt ausgeben glFlushAusgabe fertig wglDeleteContextRC zerstören Destroy

54 Demo: NET_Minimal Load SizeChanged Paint Render Context erzeugen Sichtbarkeitsbereich und Fensterbereich einstellen ClearBuffer() MC-Trafos Objekte ausgeben SwapBuffer()

55 Demo: NET_Bewegt Bewegtes Bild Timer_Tickglobale Paramter ändern Invalidate() Form_LoadmyForm.SetStyle( ControlStyles.Opaque, true ); Fensterbereich nicht löschen (Zappelei), sondern nur OpenGL Buffer einblenden Timer WinForm

56 Eigene Objekte OpenGL Punkt Linie Polygon (Dreieck, Viereck) Oberflächen- elemente 3D Objekt bisher: aux-Objekte

57 Fläche übergeben glBegin (GL_POLYGON); //Würfel vorne glVertex3d (+1,+1,+1); //r o glVertex3d (-1,+1,+1); //l o glVertex3d (-1,-1,+1); //l u glVertex3d (+1,-1,+1); //r u glEnd (); glBegin (GL_POLYGON); //Würfel vorne glVertex3d (+1,+1,+1); //r o glVertex3d (-1,+1,+1); //l o glVertex3d (-1,-1,+1); //l u glVertex3d (+1,-1,+1); //r u glEnd (); -1,-1,1 1,-1,1 1,1,1 -1,1,1 Linksumlauf OpenGL Pipeline OpenGL Pipeline

58 Fläche & Normale glBegin (GL_POLYGON); //Würfel vorne glNormal3d (0,0,1); glVertex3d (+1,+1,+1); //r o glVertex3d (-1,+1,+1); //l o glVertex3d (-1,-1,+1); //l u glVertex3d (+1,-1,+1); //r u glEnd (); glBegin (GL_POLYGON); //Würfel vorne glNormal3d (0,0,1); glVertex3d (+1,+1,+1); //r o glVertex3d (-1,+1,+1); //l o glVertex3d (-1,-1,+1); //l u glVertex3d (+1,-1,+1); //r u glEnd (); -1,-1,1 1,-1,1 1,1,1 -1,1,1 Linksumlauf * senkrecht von Oberfläche weg * z.B. für Lichtabstrahlung wichtig Normalvektor

59 Demo: Wuerfel Würfel ohne Licht und Material

60 Agenda GDI+ 3D-Grafik OpenGL Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung

61 Licht & Material ambientes Licht bis 8 Lichtquellen Material-Eigenschaften Farbe im Color Buffer glEnable ( GL_LIGHTING ) glEnable ( GL_LIGHT0 )...

62 Licht-Arten ambientes Licht diffuses Licht Spekulares Licht Emittiertes Licht keine Einfallsrichtung (im Raum verteilt) keine Abstrahlrichtung Einfallsrichtung (--> Schräge der Fläche) keine Abstrahlrichtung Einfallsrichtung (--> Schräge der Fläche) Ausfallsrichtung (--> Lage zum Betrachter) Unabhängige Materialfarbe

63 Ambientes Licht (global) glLightModelfv (GL_LIGHT_MODEL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } ); glLightModelfv (GL_LIGHT_MODEL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } ); Interne Berechnung Beispiel: Rot-Wert:RDarstellung = RGlobalAmbient * RMaterial + RLight0 * Rmaterial

64 Lichtquellen 0..7 glLightfv ( GL_LIGHT0, GL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } ); glLightfv ( GL_LIGHT0, GL_DIFFUSE, new float[] { 0.4f, 0.4f, 0.4f, 1.0f } ); glLightfv ( GL_LIGHT0, GL_SPECULAR, new float[] { 0.5f, 0.5f, 0.5f, 1.0f }); glLightfv ( GL_LIGHT0, GL_POSITION, new float[] { 0.0f, 0.0f, 1.0f, 1.0f } ); //1=nahes Licht //0=fernes Licht glEnable ( GL_LIGHT0 ); glLightfv ( GL_LIGHT0, GL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } ); glLightfv ( GL_LIGHT0, GL_DIFFUSE, new float[] { 0.4f, 0.4f, 0.4f, 1.0f } ); glLightfv ( GL_LIGHT0, GL_SPECULAR, new float[] { 0.5f, 0.5f, 0.5f, 1.0f }); glLightfv ( GL_LIGHT0, GL_POSITION, new float[] { 0.0f, 0.0f, 1.0f, 1.0f } ); //1=nahes Licht //0=fernes Licht glEnable ( GL_LIGHT0 );

65 Material glMaterialfv ( GL_FRONT, GL_AMBIENT, new float[] { 0.4f, 0.4f, 0.0f, 1.0f } ); glMaterialfv ( GL_FRONT, GL_DIFFUSE, new float[] { 0.7f, 0.7f, 0.7f, 1.0f } ); // RGBA! glMaterialfv ( GL_FRONT, GL_SPECULAR, new float[] { 0.9f, 0.9f, 0.9f, 1.0f } ); glMaterial ( GL_FRONT, GL_SHININESS, 10.0 ); glMaterialfv ( GL_FRONT, GL_EMISSION, new float[] { 0.0f, 0.0f, 0.0f, 1.0f } ); auxSolidCube (1.0); glMaterialfv ( GL_FRONT, GL_AMBIENT, new float[] { 0.4f, 0.4f, 0.0f, 1.0f } ); glMaterialfv ( GL_FRONT, GL_DIFFUSE, new float[] { 0.7f, 0.7f, 0.7f, 1.0f } ); // RGBA! glMaterialfv ( GL_FRONT, GL_SPECULAR, new float[] { 0.9f, 0.9f, 0.9f, 1.0f } ); glMaterial ( GL_FRONT, GL_SHININESS, 10.0 ); glMaterialfv ( GL_FRONT, GL_EMISSION, new float[] { 0.0f, 0.0f, 0.0f, 1.0f } ); auxSolidCube (1.0);

66 Demo: LichtMaterial (1) LichtMaterial Sample Lichtquellen und Materialeigenschaften.

67 Spotlight float fDirection[] = { 0.0f, 0.0f, -1.0f }; glLightfv ( GL_LIGHT0, GL_SPOT_DIRECTION, fDirection );//Richtung glLightf ( GL_LIGHT0, GL_SPOT_CUTOFF, 15.0f );//Öffnungswinkel glLightf ( GL_LIGHT0, GL_SPOT_EXPONENT, 0.0f );//Fokussierung float fDirection[] = { 0.0f, 0.0f, -1.0f }; glLightfv ( GL_LIGHT0, GL_SPOT_DIRECTION, fDirection );//Richtung glLightf ( GL_LIGHT0, GL_SPOT_CUTOFF, 15.0f );//Öffnungswinkel glLightf ( GL_LIGHT0, GL_SPOT_EXPONENT, 0.0f );//Fokussierung Nahe Lichtquelle als Taschenlampe Exponent =0 --> immer Faktor 1 sonst: je senkrechter Licht, desto stärker

68 entfernt weniger Licht Nahe Lichtquelle als Taschenlampe glLightf ( GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0f ); glLightf ( GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0f ); glLightf ( GL_LIGHT0, GL_QUDRATIC_ATTENUATION, 0.0f ); glLightf ( GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0f ); glLightf ( GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0f ); glLightf ( GL_LIGHT0, GL_QUDRATIC_ATTENUATION, 0.0f ); konstantunabhängig von Entfernung schwächeres Licht linearmit Entfernung gleichmäßige Lichtabnahme quadratischmit Entfernung raschere Lichtabnahme Alles wirkt zusammen

69 Nebel float fRGB[] = { 0.1f, 0.1f, 0.1f }; glFogi ( GL_FOG_MODE, GL_EXP ); // exponentiell mit Entfernung glFogfv ( GL_FOG_COLOR, fRGB ); // Nebelfarbe glFogf ( GL_FOG_DENSITY, 0.15 ); // Nebeldichte glEnable ( GL_FOG ); float fRGB[] = { 0.1f, 0.1f, 0.1f }; glFogi ( GL_FOG_MODE, GL_EXP ); // exponentiell mit Entfernung glFogfv ( GL_FOG_COLOR, fRGB ); // Nebelfarbe glFogf ( GL_FOG_DENSITY, 0.15 ); // Nebeldichte glEnable ( GL_FOG ); Näher --> Materialfarbe Ferner --> Nebelfarbe Näher --> Materialfarbe Ferner --> Nebelfarbe

70 Transparentes Material RGBA A = Alpha-Wert Alpha Blending Vorhandene, weiter entfernte Pixel im Frame Buffer: * nicht überschreiben * durchscheinen lassen i.a.: Alpha = 1 --> undurchsichtig z.B.Alpha = > 80% von dahinterliegendender Pixelfarbe i.a.: Alpha = 1 --> undurchsichtig z.B.Alpha = > 80% von dahinterliegendender Pixelfarbe

71 ff transparentes Material glEnable ( GL_BLEND ); glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); float fDiffuse[] = {0.9f, 0.9f, 0.9f, 0.7f ); // Alpha=0.7 glMaterialfv ( GL_FRONT, GL_DIFFUSE, fDiffuse ); auxSolidShere (1.0);// Überschreibt nicht gnadenlos // weiter entfernte Teile glEnable ( GL_BLEND ); glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); float fDiffuse[] = {0.9f, 0.9f, 0.9f, 0.7f ); // Alpha=0.7 glMaterialfv ( GL_FRONT, GL_DIFFUSE, fDiffuse ); auxSolidShere (1.0);// Überschreibt nicht gnadenlos // weiter entfernte Teile

72 Back Face Culling Rückseiten der Flächen werden nicht gezeichnet. Ausschalten glDisable ( GL_CULL_FACE ); //keine Anzeigeunterdrückung glLightModeli ( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); //auch Lichtberechnungen glDisable ( GL_CULL_FACE ); //keine Anzeigeunterdrückung glLightModeli ( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); //auch Lichtberechnungen

73 Demo: LichtMaterial (2) LichtMaterial Sample 17.. Alpha-Blending, Back Face Culling

74 Agenda GDI+ 3D-Grafik OpenGL Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung

75 OpenGL Bitmaps Nix bunt! ( Bit-Map) 1er-Bits = aktuelle Farbe Keine Trafo (Drehen…) glRasterPos glBitmap Ausgabeposition im MC Darstellung Parameter: Adresse der Pixel,...

76 Images Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B Keine Trafo (Drehen…) glRasterPos glDrawPixels Ausgabeposition im MC Darstellung Parameter: Adresse der Pixel,... Win32 BMPs: Blue-Green-Red-Reihenfolge!

77 Texturen Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B Höhe, Breite: 2 n -Wert Überzieht eine Objekt-Fläche Mit der Fläche transformiert (gedreht…) Win32 BMPs: Blue-Green-Red-Reihenfolge! glEnable ( GL_TEXTURE_2D ) glTexImage2D Texturen verwendbar Pixelarray übergeben

78 Textur auf Fläche glBegin (GL_POLYGON); //Fläche glNormal3d (0,0,1); glTexCoord2d ( 0.6, 0.5); glVertex3d (1,1,0); //r o glTexCoord2d ( 0.2, 0.5); glVertex3d (-1,1,0); //l o glTexCoord2d ( 0.2, 0.1); glVertex3d (-1,-1,0); //l u glTexCoord2d ( 0.6, 0.1); glVertex3d (1,-1,0); //r u glEnd (); glBegin (GL_POLYGON); //Fläche glNormal3d (0,0,1); glTexCoord2d ( 0.6, 0.5); glVertex3d (1,1,0); //r o glTexCoord2d ( 0.2, 0.5); glVertex3d (-1,1,0); //l o glTexCoord2d ( 0.2, 0.1); glVertex3d (-1,-1,0); //l u glTexCoord2d ( 0.6, 0.1); glVertex3d (1,-1,0); //r u glEnd (); t s Rahmen: Ziel-Fläche eines 3D-Objekts

79 Demo: BmpNFonts (1) BmpNFonts Bitmap Image Texture (Font kommt später)

80 Agenda GDI+ 3D-Grafik OpenGL Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung

81 Display Lists Anweisungsfolgen OpenGL- Verwaltung Abruf mit Index (RC-lokal!) glNewList (inx,GL_COMPILE) // OpenGL-Anweisungen glEndList () glNewList (inx,GL_COMPILE) // OpenGL-Anweisungen glEndList () glDeleteLists (inxFirst, nCount) glCallList (inx) glListBase ( inxOffset ) glCallLists ( nCount, GL_INT, inxArr ) glCallList (inx) glListBase ( inxOffset ) glCallLists ( nCount, GL_INT, inxArr )

82 True Type Fonts wglUseFontOutlines Erzeugt Display List für jeden Glyphen (Zeichendarstellung) glCallLists Anzeige eines String. String als Indexarray für die Display Lists der Glyphen

83 Demo: BmpNFonts (2) BmpNFonts Font

84 Agenda GDI+ 3D-Grafik OpenGL Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung

85 Flächenelemente Nicht erlaubt Einkerbung Ausstanzung Rechts-Umlaufsinn Nein !

86 Einfache Elemente Flächen direkt programmierbar Würfel Pyramide …

87 Berechnete Objekte Flächenelemente berechnen Kugel Rohr … Punktegitter erzeugen Die benachbarten Punkte umschließen eine Fläche (vgl. auxWireSphere...) oft

88 Kombi-Objekte Zusammensetzung aus elementaren Teilobjekten

89 Objekte scannen Prinzip: Thomograf Punktegitter Textur Farben Punktegitter Textur Farben Echoabstastung für Koordinaten + Kamera für Texturelemente + Lichtreflexion messen für Material,Normalen

90 Demo: Objects Objects KombiObjects RobotMSJ RobotMSJ stammt vom MSDN.

91 Agenda GDI+ 3D-Grafik OpenGL Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung

92 Demo: MoveCamera Implementierung Fall: Kamera schwenkt nach rechts --> ganze Szene dreht sich nach links --> MC-System vor der Objektdarstellung nach links rotieren dito: sonstige Bewegung

93 Agenda GDI+ 3D-Grafik OpenGL Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung

94 Direct3D Schnelle 3D-Grafik auf Windows- Systemen Gerne für Spiele verwendet Rendering Engine mit Objektmodell Projekttyp im VS.NET …

95 3D Beschreibungsformat Z.B. 3D-Grafik über das Internet via 3D-Modell-Beschreibungsformat VRML, ISO Standard seit 1997 (Virtual Reality Modeling Language) Soll ersetzt werden, weil XML erwünscht Cosmo Player (Platinium) als IE-Plugin Beispiele, siehe X3D (eXtensible 3D) Wird als VRML-Nachfolger gesehen Siehe auch

96 Agenda GDI+ 3D-Grafik Schlußbemerkung

97 Zusammenfassung GDI+ wird in WinForms verwendet GDI+ nutzt Transformationsmatrizen OpenGL und Direct3D ermöglichen 3D- Grafik Transformationen sind das A&O Objekte werden im durch Flächenelemente beschrieben Verschiedene Lichtquellen für plastische Darstellung

98 Fragen!? Uff...


Herunterladen ppt "Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group"

Ähnliche Präsentationen


Google-Anzeigen