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...
![Page 1: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/1.jpg)
Grafik-programmierung
GDI+, 3D
Frank LangeMicrosoft Deutschland GmbH
.NET Strategy & Developer [email protected]
![Page 2: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/2.jpg)
Agenda GDI+ 3D-Grafik Schlußbemerkung
![Page 3: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/3.jpg)
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
![Page 4: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/4.jpg)
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?
![Page 5: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/5.jpg)
GDI+ Verfügbarkeit
Windows XP: ja. Win98, WinME, NT4SP6, Win2K:
als Add-On .NET Framework: kein Ausweg!
![Page 6: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/6.jpg)
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
![Page 7: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/7.jpg)
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.)
![Page 8: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/8.jpg)
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
![Page 9: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/9.jpg)
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();
![Page 10: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/10.jpg)
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);}
![Page 11: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/11.jpg)
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
![Page 12: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/12.jpg)
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
![Page 13: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/13.jpg)
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
![Page 14: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/14.jpg)
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
![Page 15: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/15.jpg)
Trafomatrix
3x3 – Matrix speichert gesamte Folge von Trafos (Translation, Rotation, Skalierung)
„Matrix Representation of Transformations“( .NET Framework Developer's Guide )
![Page 16: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/16.jpg)
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
![Page 17: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/17.jpg)
Demo: Bewegung
Dito: Drawing ändert sich nicht, aber das Koordinatensystem („der Betrachter)
![Page 18: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/18.jpg)
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.
![Page 19: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/19.jpg)
Demo: ObjMover
Objekte, rotierbar und verschiebbar Anklicken eines Objekts erkennen Flicker-freie Darstellung
![Page 20: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/20.jpg)
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…
![Page 21: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/21.jpg)
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
![Page 22: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/22.jpg)
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!
![Page 23: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/23.jpg)
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
![Page 24: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/24.jpg)
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
![Page 25: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/25.jpg)
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){ //...}
![Page 26: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/26.jpg)
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){ //...}
![Page 27: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/27.jpg)
Demo: Printing
Print! Print… Print Preview
![Page 28: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/28.jpg)
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
![Page 29: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/29.jpg)
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);
![Page 30: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/30.jpg)
Agenda GDI+ 3D-Grafik
• OpenGL
• Direct3D
Schlußbemerkung
![Page 31: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/31.jpg)
Hinter den Bergen…
ArbeitArbeit
FunktionenFunktionen
MatheMatheIdeeIdeeIdeeIdee
ProgrammProgrammProgrammProgramm
Verstehen der/einer GrafikbibliothekProgrammrahmenEinige grundlegende Features
![Page 32: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/32.jpg)
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
![Page 33: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/33.jpg)
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
![Page 34: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/34.jpg)
OpenGL als Standard
PlattformunabhängigPlattformunabhängig
OpenGL (TM)OpenGL (TM) Architectural Review Board
Unix, NT, Win95...
“Echtzeitgrafik”“Echtzeitgrafik” schnelle Algorithmen,kein Raytracing
![Page 35: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/35.jpg)
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
![Page 36: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/36.jpg)
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)
![Page 37: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/37.jpg)
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
![Page 38: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/38.jpg)
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...)
![Page 39: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/39.jpg)
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
![Page 40: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/40.jpg)
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
![Page 41: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/41.jpg)
Koordinatensystem
Y
-Z
X
Daumen
Zeigefinger
Mittelfinger+z
Rechtssystem rechte Hand-Regel
![Page 42: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/42.jpg)
Welt-, Modellkoordinaten
Y
-Z
X
WC
MCY
-Z
1
1
1
X
Modellkoordinaten
(Arbeitskoordinaten)
Weltkoordinatensystem (immer fix)
![Page 43: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/43.jpg)
Transformationen
Rotation (Drehen)Rotation (Drehen)
Translation (Verschieben)Translation (Verschieben)
Skalierung (Dehnen/Stauchen)Skalierung (Dehnen/Stauchen)
glTranslate
glRotate
glScale
MC für Objektausgabe vorbereiten
![Page 44: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/44.jpg)
„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.
![Page 45: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/45.jpg)
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
![Page 46: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/46.jpg)
Demo: MoveMCMoveMC
Tastatur-Steuerung
MoveMC.exeMoveMC.exe
![Page 47: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/47.jpg)
Voreinstellungen
Sichtbereich im WCSichtbereich im WC
Geräte-AusgabebereichGeräte-Ausgabebereich
Y
X
-Z
Window
glFrustum / gluPerspective
glViewport
![Page 48: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/48.jpg)
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
![Page 49: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/49.jpg)
Geräte-Ausgabebereich
Y
X
-Z
WindowglViewport ( 0,0,
windowWidth, windowHeight);
glViewport ( 0,0, windowWidth, windowHeight);
Geräte-AusgabebereichGeräte-Ausgabebereich
glViewport
![Page 50: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/50.jpg)
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
![Page 51: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/51.jpg)
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
![Page 52: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/52.jpg)
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()
![Page 53: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/53.jpg)
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
![Page 54: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/54.jpg)
Demo: NET_Minimal
LoadLoad
SizeChangedSizeChanged
PaintPaint
Render Contexterzeugen
Sichtbarkeitsbereich undFensterbereicheinstellen
ClearBuffer()
MC-TrafosObjekte ausgeben
SwapBuffer()
![Page 55: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/55.jpg)
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
![Page 56: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/56.jpg)
Eigene Objekte
OpenGLOpenGL
Punkt
Linie
Polygon
(Dreieck, Viereck)
Oberflächen-elemente
3D Objekt3D Objekt
bisher: “aux”-Objekte
![Page 57: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/57.jpg)
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
![Page 58: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/58.jpg)
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
![Page 59: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/59.jpg)
Demo: Wuerfel
Würfel ohne Licht und Material
![Page 60: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/60.jpg)
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
![Page 61: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/61.jpg)
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 )...
![Page 62: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/62.jpg)
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
![Page 63: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/63.jpg)
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
![Page 64: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/64.jpg)
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 );
![Page 65: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/65.jpg)
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);
![Page 66: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/66.jpg)
Demo: LichtMaterial (1)LichtMaterial
Sample 1..15
Lichtquellen und Materialeigenschaften.
Licht BetrachterNormale,
hier aucheLicht+Betrachter
![Page 67: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/67.jpg)
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
![Page 68: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/68.jpg)
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
![Page 69: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/69.jpg)
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
![Page 70: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/70.jpg)
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
![Page 71: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/71.jpg)
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
![Page 72: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/72.jpg)
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
![Page 73: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/73.jpg)
Demo: LichtMaterial (2)LichtMaterial
Sample 17..
Alpha-Blending, Back Face Culling
![Page 74: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/74.jpg)
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
![Page 75: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/75.jpg)
OpenGL Bitmaps
Nix bunt! ( „Bit“-Map) 1er-Bits = aktuelle Farbe Keine Trafo (Drehen…)
glRasterPosglRasterPos
glBitmapglBitmap
Ausgabeposition im MC
Darstellung
Parameter: Adresse der Pixel,...
![Page 76: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/76.jpg)
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!
![Page 77: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/77.jpg)
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
![Page 78: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/78.jpg)
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
![Page 79: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/79.jpg)
Demo: BmpNFonts (1)BmpNFonts
Bitmap
Image
Texture
(Font kommt später)
![Page 80: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/80.jpg)
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
![Page 81: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/81.jpg)
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 )
![Page 82: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/82.jpg)
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
![Page 83: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/83.jpg)
Demo: BmpNFonts (2)BmpNFonts
Font
![Page 84: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/84.jpg)
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
![Page 85: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/85.jpg)
Flächenelemente
Nicht erlaubtNicht erlaubt
0
12
3
4
Einkerbung
Ausstanzung
Rechts-Umlaufsinn
Nein !Nein !
Nein !Nein !
Nein !Nein !
![Page 86: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/86.jpg)
Einfache Elemente
Flächen direkt programmierbar
• Würfel
• Pyramide
• …
![Page 87: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/87.jpg)
Berechnete Objekte
Flächenelemente berechnen
• Kugel
• Rohr
• …
Punktegitter erzeugen
Die benachbarten Punkte umschließen eine Fläche (vgl. auxWireSphere...)
oftoft
![Page 88: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/88.jpg)
Kombi-Objekte
Zusammensetzung aus elementaren Teilobjekten
![Page 89: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/89.jpg)
Objekte scannen
Prinzip: Thomograf
PunktegitterTexturFarben
PunktegitterTexturFarben
Echoabstastung für Koordinaten
+
Kamera für Texturelemente
+
Lichtreflexion messenfür Material,Normalen
![Page 90: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/90.jpg)
Demo: ObjectsObjects
KombiObjects
RobotMSJ
RobotMSJ stammt vom MSDN.
![Page 91: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/91.jpg)
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
![Page 92: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/92.jpg)
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
![Page 93: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/93.jpg)
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
![Page 94: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/94.jpg)
Direct3D
Schnelle 3D-Grafik auf Windows-Systemen
Gerne für Spiele verwendet Rendering Engine mit Objektmodell Projekttyp im VS .NET …
![Page 95: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/95.jpg)
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
![Page 96: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/96.jpg)
Agenda GDI+ 3D-Grafik Schlußbemerkung
![Page 97: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/97.jpg)
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
![Page 98: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com.](https://reader038.fdocument.pub/reader038/viewer/2022103112/55204d6249795902118b726c/html5/thumbnails/98.jpg)
Fragen!?
Uff...Uff...