Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer...
-
Upload
adalric-blomberg -
Category
Documents
-
view
105 -
download
0
Transcript of Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer...
Grafik-programmierung
GDI+, 3D
Frank LangeMicrosoft Deutschland GmbH
.NET Strategy & Developer [email protected]
Agenda GDI+ 3D-Grafik Schlußbemerkung
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
Das Historische Erlebnis
DOSWelcher 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 GDIHDC, 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?
GDI+ Verfügbarkeit
Windows XP: ja. Win98, WinME, NT4SP6, Win2K:
als Add-On .NET Framework: kein Ausweg!
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
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.)
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
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();
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);}
#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);}
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
Demo: BuildingBlocks
Lines Rectangles Ellipses Arcs Polygons Cardinal Splines
Wie mit biegsamem Linieal gezogene Linie
Bézier splinesStart-, Endpunkt und zwei „magnetische“ Punkte in der Ferne
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
Koordinatensysteme
PagePage
WorldWorld 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
DeviceDevice Ursprung links oben
Pixel als Einheit
Trafomatrix
3x3 – Matrix speichert gesamte Folge von Trafos (Translation, Rotation, Skalierung)
„Matrix Representation of Transformations“( .NET Framework Developer's Guide )
Demo: Trafo
g.Transform die Trafo-Matrix
g.TranslateTransform (dx,dy)g.TranslateTransform (dx,dy)
g.ScaleTransform (xMult, yMult)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)g.RotateTransform (30) z.B: y-Werte nach oben wachsend
Pen-Breite ist in Weltkoordinatenz.B. Auflösung auf DINA4-mm stellen und dann Pen in mm
Demo: Bewegung
Dito: Drawing ändert sich nicht, aber das Koordinatensystem („der Betrachter)
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 );
}
DoubleBufferDoubleBuffer Bild wird im Hintergrund aufgebaut
AllPaintingInWmPaintAllPaintingInWmPaintWM_ERASEBKGND führt noch nicht zum Löschen des Fensters
UserPaintUserPaintOS führt kein Caching des Inhalts aus.Bei schnellen Bewegungen wäre das unnötig.
Demo: ObjMover
Objekte, rotierbar und verschiebbar Anklicken eines Objekts erkennen Flicker-freie Darstellung
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…
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
Standarddrucker (GDI)
GDI (ohne „+“)
PRINTDLG pdlg;
// Initmemset( &pdlg, 0, sizeof( PRINTDLG ) );pdlg.lStructSize = sizeof( PRINTDLG );
// Flag: ich möchte DCpdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
// Kein Show! PrintDlg( &pdlg ); // Da ist er: DCpdlg.hDC;
PRINTDLG pdlg;
// Initmemset( &pdlg, 0, sizeof( PRINTDLG ) );pdlg.lStructSize = sizeof( PRINTDLG );
// Flag: ich möchte DCpdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
// Kein Show! PrintDlg( &pdlg ); // Da ist er: DCpdlg.hDC;
..und nun gleich wieder vergessen!
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
Standarddrucker (.NET)
PrintDocument, PrintPageEventHandler
PrintDocument doc = new PrintDocument(); // Default Printerdoc.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 Printerdoc.PrintPage += new PrintPageEventHandler(MyPrintFunc);doc.Print(); // Empfehlenswert: try-catch-Szenario
void MyPrintFunc (object sender, PrintPageEventArgs e)
{
// nutze e.Graphics
e.HasMorePages = false;
}
PrintDocumentPrintDocument PrintPageEventHandler
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){ //...}
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){ //...}
Demo: Printing
Print! Print… Print Preview
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
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);
Agenda GDI+ 3D-Grafik
• OpenGL
• Direct3D
Schlußbemerkung
Hinter den Bergen…
ArbeitArbeit
FunktionenFunktionen
MatheMatheIdeeIdeeIdeeIdee
ProgrammProgrammProgrammProgramm
Verstehen der/einer GrafikbibliothekProgrammrahmenEinige grundlegende Features
OpenGL vs. Direct3D
OpenGLOpenGL
OpenGL, Direct3DOpenGL, Direct3D
Direct3DDirect3D
• Ä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
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
OpenGL als Standard
PlattformunabhängigPlattformunabhängig
OpenGL (TM)OpenGL (TM) Architectural Review Board
Unix, NT, Win95...
“Echtzeitgrafik”“Echtzeitgrafik” schnelle Algorithmen,kein Raytracing
Funktionsgruppen
Wiggle - Funktionen (MS)Wiggle - Funktionen (MS)
Core Set - FunktionenCore Set - Funktionen“gl”
“wgl”
Win32 - Funktionen (MS)Win32 - Funktionen (MS)ohne
“glu”
“aux”
Präfix
Utility - FunktionenUtility - Funktionen
Auxiliary - FunktionenAuxiliary - Funktionen
Datentypen
OpenGLOpenGL .NET.NET KennungKennung
GLbyte SByte b
GLint Int32 i
GLenum UInt32 ui
GLfloat Single f
GLdouble Double d
(Array) v
...
OpenGLOpenGL .NET.NET KennungKennung
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) .NET z.B. System.Int32 (unabh. Von Programmiersprache)
Funktionsnamen
API-PräfixAPI-Präfix Parametertyp-PostfixParametertyp-PostfixNameName
(falls versch. Versionen)
Beispiel
glVertex3dv Core Set API
“Vertex”-Funktion
3 double-Werte als Array
void glVertex3dv( double[] v);
glVertex3dv Core Set API
“Vertex”-Funktion
3 double-Werte als Array
void glVertex3dv( double[] v);
--> Online Hilfe: z.B. glVertex, glGet
Rendering Context
Color Buffer( DC )
Color Buffer( DC )
Depth Buffer(z-Buffer)
Depth Buffer(z-Buffer)
sonstigePuffer
sonstigePuffer
x,yx,y x,yx,y x,yx,y
Frame BufferFrame Buffer
3D-Programmierung
RENDERINGRENDERING
CONTEXTCONTEXTEinstellungen (Licht...)Einstellungen (Licht...)
OpenGL unter .NET
Noch kein offizielles MS-Assembly Verschiedenes im Internet:
• GLSharp (http://www.headbits.com/)
• 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
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
Koordinatensystem
Y
-Z
X
Daumen
Zeigefinger
Mittelfinger+z
Rechtssystem rechte Hand-Regel
Welt-, Modellkoordinaten
Y
-Z
X
WC
MCY
-Z
1
1
1
X
Modellkoordinaten
(Arbeitskoordinaten)
Weltkoordinatensystem (immer fix)
Transformationen
Rotation (Drehen)Rotation (Drehen)
Translation (Verschieben)Translation (Verschieben)
Skalierung (Dehnen/Stauchen)Skalierung (Dehnen/Stauchen)
glTranslate
glRotate
glScale
MC für Objektausgabe vorbereiten
„Aux“-Objekte
auxSolidTeapot Teekessel
auxWireTeapot -”- Drahtmodell
auxSolidCube Würfel
auxWireCube -”- Drahtmodell
...
Anmerkung: Aux-Funktionen heißen in GLSharp glut-Funktionen.Anmerkung: Aux-Funktionen heißen in GLSharp glut-Funktionen.
Demo: Transformations
.NET-Rahmenstatic 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
Demo: MoveMCMoveMC
Tastatur-Steuerung
MoveMC.exeMoveMC.exe
Voreinstellungen
Sichtbereich im WCSichtbereich im WC
Geräte-AusgabebereichGeräte-Ausgabebereich
Y
X
-Z
Window
glFrustum / gluPerspective
glViewport
Sichtbarer Bereich
Sichtbereich im WCSichtbereich im WC
Y
X
-Z
glFrustum / gluPerspective
glMatrixMode ( GL_PROJECTION);glFrustum ( links, rechts, unten, oben, zStart, zEnde );
glMatrixMode ( GL_PROJECTION);glFrustum ( links, rechts, unten, oben, zStart, zEnde );
glMatrixMode ( GL_PROJECTION);gluPerspective (
öffnungWinkel, y_zu_x_Aspect,zStart, zEnde );
glMatrixMode ( GL_PROJECTION);gluPerspective (
öffnungWinkel, y_zu_x_Aspect,zStart, zEnde );
Oder:
-Z
15°
15°
-z * sin(15°)
0
Geräte-Ausgabebereich
Y
X
-Z
WindowglViewport ( 0,0,
windowWidth, windowHeight);
glViewport ( 0,0, windowWidth, windowHeight);
Geräte-AusgabebereichGeräte-Ausgabebereich
glViewport
Trafo-Pipeline
Y
X
-Z
MC1
Window
Object Coordinates (MC)
Eye Coordinates (WC)
Windows Coordinates
Clip Coordinates
(Fläche)
Modelview TrafoModelview TrafoProjection TrafoProjection Trafo
Viewport TrafoViewport Trafo
11
2233
44
Wo sind die Trafo-Infos?
Modelview TrafoModelview Trafo
Projection TrafoProjection Trafo
Viewport TrafoViewport Trafo
Modelview Matrix
Projection Matrix
x,y, width, height
Matrix: mathematische Datenstruktur, die alle Tranformationenseinstellungen speichert
Zugriff auf Einstellungen
Modelview TrafoModelview Trafo
Projection TrafoProjection Trafo
Viewport TrafoViewport 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 MachineOpenGL als State MachineAbfrage über glGetGL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX, GL_VIEWPORT
ZwischenspeichernglPushMatrix(), glPopMatrix()
Abfrage über glGetGL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX, GL_VIEWPORT
ZwischenspeichernglPushMatrix(), glPopMatrix()
Demo: SDK_Minimal
CreateCreate
SizeSize
PaintPaint
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örenDestroyDestroy
Demo: NET_Minimal
LoadLoad
SizeChangedSizeChanged
PaintPaint
Render Contexterzeugen
Sichtbarkeitsbereich undFensterbereicheinstellen
ClearBuffer()
MC-TrafosObjekte ausgeben
SwapBuffer()
Demo: NET_Bewegt
Bewegtes BildBewegtes Bild
Timer_Tick globale Paramter ändernInvalidate()
Form_Load myForm.SetStyle( ControlStyles.Opaque, true );
Fensterbereich nicht löschen(„Zappelei“), sondern nurOpenGL Buffer einblenden
TimerTimer
WinFormWinForm
Eigene Objekte
OpenGLOpenGL
Punkt
Linie
Polygon
(Dreieck, Viereck)
Oberflächen-elemente
3D Objekt3D Objekt
bisher: “aux”-Objekte
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,11,-1,1
1,1,11,1,1-1,1,1-1,1,1
Linksumlauf
OpenGLPipeline
OpenGLPipeline
Fläche & Normale
glBegin (GL_POLYGON); //Würfel vorne
glNormal3d (0,0,1);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);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,11,-1,1
1,1,11,1,1-1,1,1-1,1,1
Linksumlauf
* senkrecht von Oberfläche weg
* z.B. für Lichtabstrahlung wichtig
NormalvektorNormalvektor
Demo: Wuerfel
Würfel ohne Licht und Material
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
Licht & Material
ambientes Lichtambientes Licht bis 8 Lichtquellenbis 8 Lichtquellen
Material-EigenschaftenMaterial-Eigenschaften
Farbe im Color Buffer
glEnable ( GL_LIGHTING )glEnable ( GL_LIGHTING )
glEnable ( GL_LIGHT0 )...glEnable ( GL_LIGHT0 )...
Licht-Arten
ambientes Lichtambientes Licht
diffuses Lichtdiffuses Licht
Spekulares LichtSpekulares Licht
“Emittiertes 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
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 BerechnungBeispiel: Rot-Wert: RDarstellung = RGlobalAmbient * RMaterial + RLight0 *
Rmaterial
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 );
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);
Demo: LichtMaterial (1)LichtMaterial
Sample 1..15
Lichtquellen und Materialeigenschaften.
Licht BetrachterNormale,
hier aucheLicht+Betrachter
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”Nahe Lichtquelle als “Taschenlampe”
Exponent =0 --> immer Faktor 1
sonst: je senkrechter Licht, desto stärker
entfernt weniger Licht
Nahe Lichtquelle als “Taschenlampe”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 );
konstant unabhängig von Entfernung schwächeres Licht
linear mit Entfernung gleichmäßige Lichtabnahme
quadratisch mit Entfernung raschere Lichtabnahme
Alles wirkt zusammenAlles wirkt zusammen
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 --> MaterialfarbeFerner --> Nebelfarbe
Näher --> MaterialfarbeFerner --> Nebelfarbe
Transparentes Material
RGBARGBA A = Alpha-Wert
Alpha BlendingAlpha Blending Vorhandene, weiter entfernte Pixel im Frame Buffer:
* nicht überschreiben
* “durchscheinen” lassen
i.a.: Alpha = 1 --> undurchsichtig
z.B. Alpha = 0.2 --> 80% von dahinterliegendender Pixelfarbe
i.a.: Alpha = 1 --> undurchsichtig
z.B. Alpha = 0.2 --> 80% von dahinterliegendender Pixelfarbe
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
Back Face Culling
Back Face CullingBack 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
Demo: LichtMaterial (2)LichtMaterial
Sample 17..
Alpha-Blending, Back Face Culling
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
OpenGL Bitmaps
Nix bunt! ( „Bit“-Map) 1er-Bits = aktuelle Farbe Keine Trafo (Drehen…)
glRasterPosglRasterPos
glBitmapglBitmap
Ausgabeposition im MC
Darstellung
Parameter: Adresse der Pixel,...
Images
Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B Keine Trafo (Drehen…)
glRasterPosglRasterPos
glDrawPixelsglDrawPixels
Ausgabeposition im MC
Darstellung
Parameter: Adresse der Pixel,...
Win32 BMPs: Blue-Green-Red-Reihenfolge!
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…)
Win32 BMPs: Blue-Green-Red-Reihenfolge!
glEnable ( GL_TEXTURE_2D )glEnable ( GL_TEXTURE_2D )
glTexImage2DglTexImage2D
Texturen verwendbar
Pixelarray übergeben
Textur auf FlächeglBegin (GL_POLYGON); //Fläche
glNormal3d (0,0,1);
glTexCoord2d ( 0.6, 0.5);glTexCoord2d ( 0.6, 0.5);
glVertex3d (1,1,0); //r o
glTexCoord2d ( 0.2, 0.5);glTexCoord2d ( 0.2, 0.5);
glVertex3d (-1,1,0); //l o
glTexCoord2d ( 0.2, 0.1);glTexCoord2d ( 0.2, 0.1);
glVertex3d (-1,-1,0); //l u
glTexCoord2d ( 0.6, 0.1);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);glTexCoord2d ( 0.6, 0.5);
glVertex3d (1,1,0); //r o
glTexCoord2d ( 0.2, 0.5);glTexCoord2d ( 0.2, 0.5);
glVertex3d (-1,1,0); //l o
glTexCoord2d ( 0.2, 0.1);glTexCoord2d ( 0.2, 0.1);
glVertex3d (-1,-1,0); //l u
glTexCoord2d ( 0.6, 0.1);glTexCoord2d ( 0.6, 0.1);
glVertex3d (1,-1,0); //r u
glEnd ();
10
1
0.2 0.6
0.1
0.5
t
s
Rahmen: Ziel-Fläche
eines 3D-Objekts
Demo: BmpNFonts (1)BmpNFonts
Bitmap
Image
Texture
(Font kommt später)
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
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)glDeleteLists (inxFirst, nCount)
glCallList (inx)
glListBase ( inxOffset )glCallLists ( nCount, GL_INT, inxArr )
glCallList (inx)
glListBase ( inxOffset )glCallLists ( nCount, GL_INT, inxArr )
True Type Fonts
wglUseFontOutlineswglUseFontOutlines
Erzeugt Display List für jeden Glyphen (Zeichendarstellung)
glCallListsglCallLists
Anzeige eines String. String als Indexarray für die Display Lists der Glyphen
Demo: BmpNFonts (2)BmpNFonts
Font
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
Flächenelemente
Nicht erlaubtNicht erlaubt
0
12
3
4
Einkerbung
Ausstanzung
Rechts-Umlaufsinn
Nein !Nein !
Nein !Nein !
Nein !Nein !
Einfache Elemente
Flächen direkt programmierbar
• Würfel
• Pyramide
• …
Berechnete Objekte
Flächenelemente berechnen
• Kugel
• Rohr
• …
Punktegitter erzeugen
Die benachbarten Punkte umschließen eine Fläche (vgl. auxWireSphere...)
oftoft
Kombi-Objekte
Zusammensetzung aus elementaren Teilobjekten
Objekte scannen
Prinzip: Thomograf
PunktegitterTexturFarben
PunktegitterTexturFarben
Echoabstastung für Koordinaten
+
Kamera für Texturelemente
+
Lichtreflexion messenfür Material,Normalen
Demo: ObjectsObjects
KombiObjects
RobotMSJ
RobotMSJ stammt vom MSDN.
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
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
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
Direct3D
Schnelle 3D-Grafik auf Windows-Systemen
Gerne für Spiele verwendet Rendering Engine mit Objektmodell Projekttyp im VS .NET …
3D Beschreibungsformat
Z.B. 3D-Grafik über das Internetvia 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, siehehttp://www.ocnus.com/models/Buildings/
• X3D (eXtensible 3D)Wird als VRML-Nachfolger gesehen
• Siehe auch www.web3d.org
Agenda GDI+ 3D-Grafik Schlußbemerkung
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
Fragen!?
Uff...Uff...