Präsentation herunterladen
1
Grafik- programmierung GDI+, 3D
Frank Lange Microsoft Deutschland GmbH .NET Strategy & Developer Group
2
Agenda GDI+ 3D-Grafik Schlußbemerkung
3
Agenda GDI+ 3D-Grafik Schlußbemerkung 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, hat‘s einen 387 oder 287, Postscript!, Prescribe… Windows GDI HDC, SelectObject, ReleaseDC, SelectPalette,… Windows GDI+ Graphics g; g.DrawLine(..); g.RotateTransform(30) Gibt‘s 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+ 3D-Grafik Schlußbemerkung 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+ 3D-Grafik Schlußbemerkung 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; } // auch: Graphics g = this.button1.CreateGraphics();
10
GDI+ und PrgSprachen .NET WinForm-Projekte C++ Windows-Apps
#include <windows.h> #include <gdiplus.h> // 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+ 3D-Grafik Schlußbemerkung 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+ 3D-Grafik Schlußbemerkung 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 World Page Device
Beliebig positionier-, rotier- und skalierbar Transfomationsmatrix speichert die Welttransformation Page 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
z.B: immer 1000*1000-Koordinatensystem (Egalisieren von Fenster, Drucker,…) g.ScaleTransform (xMult, yMult) g.TranslateTransform (dx,dy) 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
AllPaintingInWmPaint
Double Buffering Zappelfrei bei bewegter Darstellung DoubleBuffer Bild wird im Hintergrund aufgebaut WM_ERASEBKGND führt noch nicht zum Löschen des Fensters AllPaintingInWmPaint OS führt kein Caching des Inhalts aus. Bei schnellen Bewegungen wäre das unnötig. UserPaint private void FormMain_Load(…) { this.SetStyle( ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true ); }
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+ 3D-Grafik Schlußbemerkung 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; ..und nun gleich wieder vergessen!
23
MSDN TechTalk – <<Monat JJJJ>> <<Thema>> 23
Drucker wählen MSDN TechTalk – <<Monat JJJJ>> <<Thema>> 23 .NET: PrintDialog liefert Druckerinfos, kein Graphics-Objekt Standarddrucker PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); MessageBox.Show ( dlg.PrinterSettings.PrinterName ); Druckerwahl SDK: PRINTDLG pdlg; // Initialize the PRINTDLG structure. memset( &pdlg, 0, sizeof( PRINTDLG ) ); pdlg.lStructSize = sizeof( PRINTDLG ); // Set the flag to return printer DC. pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC; // Invoke the printer dialog box. PrintDlg( &pdlg ); // hDC member of the PRINTDLG structure contains // the printer DC. return pdlg.hDC; PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); if( dlg.ShowDialog()==DialogResult.OK) MessageBox.Show ( dlg.PrinterSettings.PrinterName );
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 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) { //... }
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) { //... }
27
Demo: Printing Print! Print… Print Preview
28
Agenda GDI+ 3D-Grafik Schlußbemerkung 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);
30
Agenda GDI+ 3D-Grafik OpenGL Direct3D Schlußbemerkung
31
Hinter den Bergen… Programm Idee Verstehen der/einer Grafikbibliothek
Programmrahmen Einige grundlegende Features Programm Arbeit Funktionen Mathe Idee
32
OpenGL vs. Direct3D OpenGL Direct3D Ähnliche Features OpenGL, Direct3D
Von Hardware beschleunigt In .NET nutzbar OpenGL 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 Direct3D
33
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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 OpenGL (TM) Plattformunabhängig “Echtzeitgrafik”
Architectural Review Board Plattformunabhängig Unix, NT, Win95... “Echtzeitgrafik” schnelle Algorithmen, kein Raytracing
35
Funktionsgruppen Präfix Core Set - Funktionen Wiggle - Funktionen (MS)
“wgl” Win32 - Funktionen (MS) ohne Utility - Funktionen “glu” Auxiliary - Funktionen “aux”
36
Datentypen OpenGL .NET Kennung GLbyte SByte b GLint Int32 i
GLenum UInt32 ui GLfloat Single f GLdouble Double d (Array) v ... .NET z.B. System.Int32 (unabh. Von Programmiersprache)
37
Funktionsnamen API-Präfix Name Parametertyp-Postfix
(falls versch. Versionen) Beispiel glVertex3dv Core Set API “Vertex”-Funktion 3 double-Werte als Array void glVertex3dv( double[] v); --> Online Hilfe: z.B. glVertex, glGet
38
Einstellungen (Licht...)
Rendering Context 3D-Programmierung Einstellungen (Licht...) RENDERING CONTEXT Frame Buffer Color Buffer ( DC ) Depth Buffer (z-Buffer) sonstige Puffer x,y x,y x,y
39
OpenGL unter .NET Noch kein offizielles MS-Assembly
Verschiedenes im Internet: GLSharp ( 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 Schlußbemerkung OpenGL Direct3D 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 Rechtssystem Y -Z X +z rechte Hand-Regel Zeigefinger
Daumen Mittelfinger
42
Welt-, Modellkoordinaten
Y Modellkoordinaten (Arbeitskoordinaten) MC 1 -Z 1 Y -Z X X 1 WC Weltkoordinatensystem (immer fix)
43
Transformationen MC für Objektausgabe vorbereiten
Translation (Verschieben) glTranslate Rotation (Drehen) glRotate Skalierung (Dehnen/Stauchen) glScale
44
„Aux“-Objekte auxSolidTeapot Teekessel auxWireTeapot -”- Drahtmodell
auxSolidCube Wü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); } Form1.cs ShowThis.cs
46
Demo: MoveMC MoveMC Tastatur-Steuerung MoveMC.exe
47
Geräte-Ausgabebereich
Voreinstellungen Y X -Z Sichtbereich im WC glFrustum / gluPerspective Geräte-Ausgabebereich Window glViewport
48
Sichtbarer Bereich Sichtbereich im WC glFrustum / gluPerspective Oder:
Y X -Z Sichtbereich im WC glFrustum / gluPerspective glMatrixMode ( GL_PROJECTION); glFrustum ( links, rechts, unten, oben, zStart, zEnde ); Oder: glMatrixMode ( GL_PROJECTION); gluPerspective ( öffnungWinkel, y_zu_x_Aspect, zStart, zEnde );
49
Geräte-Ausgabebereich
Y X -Z glViewport glViewport ( 0,0, windowWidth, windowHeight); Window
50
Trafo-Pipeline 2 3 1 4 Window Y Eye Coordinates (WC) Modelview Trafo
X -Z Eye Coordinates (WC) Modelview Trafo Projection Trafo 2 3 MC 1 1 Object Coordinates (MC) Clip Coordinates (Fläche) Window 4 Viewport Trafo Windows Coordinates
51
Wo sind die Trafo-Infos?
Modelview Trafo Modelview Matrix Projection Trafo Projection Matrix Viewport Trafo x,y, width, height Matrix: mathematische Datenstruktur, die alle Tranformationenseinstellungen speichert
52
Zugriff auf Einstellungen
Modelview Trafo glMatrixMode (GL_MODELVIEW) glLoadIdentity, glTranslated, glRotated, glScaled,... Projection Trafo glMatrixMode (GL_PROJECTION) glLoadIdentity, glFrustum,... Viewport Trafo glViewport Abfrage über glGet GL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX, GL_VIEWPORT Zwischenspeichern glPushMatrix(), glPopMatrix() OpenGL als State Machine Aktuellen Einstellung zählen --> glLoadItentity wirkt im aktuellen Matrixmode
53
Demo: SDK_Minimal Create Size Paint Destroy CreateWindow DC bekommen
SetPixelFormat DC vorbereiten wglCreateContext RC erzeugen glViewport Ausgabebereich glFrustum Sichtbereich glClear Frame Buffer löschen glTranslated... MC transformieren auxSolidTeapot... Objekt ausgeben glFlush Ausgabe fertig wglDeleteContext RC zerstören Create Size Paint Destroy
54
Demo: NET_Minimal Load SizeChanged Paint Render Context erzeugen
Sichtbarkeitsbereich und Fensterbereich einstellen ClearBuffer() MC-Trafos Objekte ausgeben SwapBuffer() Load SizeChanged Paint
55
Demo: NET_Bewegt Bewegtes Bild Timer WinForm
Timer_Tick globale Paramter ändern Invalidate() Form_Load myForm.SetStyle( ControlStyles.Opaque, true ); Fensterbereich nicht löschen („Zappelei“), sondern nur OpenGL Buffer einblenden WinForm
56
Eigene Objekte OpenGL bisher: “aux”-Objekte Punkt Linie Polygon
(Dreieck, Viereck) OpenGL 3D Objekt Oberflächen- elemente
57
Fläche übergeben -1,1,1 1,1,1 -1,-1,1 1,-1,1 OpenGL Pipeline
Linksumlauf 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 (); OpenGL Pipeline
58
Fläche & Normale Normalvektor * senkrecht von Oberfläche weg
* z.B. für Lichtabstrahlung wichtig -1,-1,1 1,-1,1 1,1,1 -1,1,1 Linksumlauf 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 ();
59
Demo: Wuerfel Würfel ohne Licht und Material
60
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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
glEnable ( GL_LIGHTING ) ambientes Licht bis 8 Lichtquellen glEnable ( GL_LIGHT0 )... Material-Eigenschaften Farbe im Color Buffer
62
Licht-Arten ambientes Licht diffuses Licht Spekulares Licht
keine Einfallsrichtung (im Raum verteilt) keine Abstrahlrichtung Einfallsrichtung (--> Schräge der Fläche) Ausfallsrichtung (--> Lage zum Betrachter) Unabhängige Materialfarbe ambientes Licht diffuses Licht Spekulares Licht “Emittiertes Licht”
63
Ambientes Licht (global)
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 );
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);
66
Demo: LichtMaterial (1)
Sample 1..15 Lichtquellen und Materialeigenschaften.
67
Nahe Lichtquelle als “Taschenlampe”
Spotlight Nahe Lichtquelle als “Taschenlampe” 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 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 ); Alles wirkt zusammen konstant unabhängig von Entfernung schwächeres Licht linear mit Entfernung gleichmäßige Lichtabnahme quadratisch mit Entfernung raschere Lichtabnahme
69
Nebel Näher --> Materialfarbe Ferner --> Nebelfarbe
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 );
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
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
72
Back Face Culling 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
73
Demo: LichtMaterial (2)
Sample 17.. Alpha-Blending, Back Face Culling
74
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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 Ausgabeposition im MC Darstellung Parameter: Adresse der Pixel,... glBitmap
76
Images Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B
Keine Trafo (Drehen…) glRasterPos Ausgabeposition im MC Darstellung Parameter: Adresse der Pixel,... glDrawPixels Win32 BMPs: Blue-Green-Red-Reihenfolge!
77
glEnable ( GL_TEXTURE_2D )
Texturen Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B Höhe, Breite: 2n-Wert Überzieht eine Objekt-Fläche Mit der Fläche transformiert (gedreht…) glEnable ( GL_TEXTURE_2D ) Texturen verwendbar glTexImage2D Pixelarray übergeben Win32 BMPs: Blue-Green-Red-Reihenfolge!
78
Textur auf Fläche t 1 1 s Rahmen: Ziel-Fläche eines 3D-Objekts
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 1 0.5 0.1 0.2 0.6 1 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 Schlußbemerkung OpenGL Direct3D 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 () glCallList (inx) glListBase ( inxOffset ) glCallLists ( nCount, GL_INT, inxArr ) glDeleteLists (inxFirst, nCount)
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 Schlußbemerkung OpenGL Direct3D 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 Nein ! Einkerbung Nein ! Ausstanzung 1 2
Rechts-Umlaufsinn Nein ! 3 4
86
Einfache Elemente Flächen direkt programmierbar Würfel Pyramide …
87
Berechnete Objekte Flächenelemente berechnen Kugel Rohr … oft
Punktegitter erzeugen Die benachbarten Punkte umschließen eine Fläche (vgl. auxWireSphere...)
88
Zusammensetzung aus elementaren Teilobjekten
Kombi-Objekte Zusammensetzung aus elementaren Teilobjekten
89
Objekte scannen Prinzip: Thomograf Punktegitter Textur Farben
Echoabstastung für Koordinaten + Kamera für Texturelemente Lichtreflexion messen für Material,Normalen Punktegitter Textur Farben
90
Demo: Objects Objects KombiObjects RobotMSJ RobotMSJ stammt vom MSDN.
91
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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 Schlußbemerkung OpenGL Direct3D 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...
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.