98
Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH .NET Strategy & Developer Group [email protected]

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

Embed Size (px)

Citation preview

Page 1: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com

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

Agenda GDI+ 3D-Grafik Schlußbemerkung

Page 3: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Demo: Printing

Print! Print… Print Preview

Page 28: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

„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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Demo: BmpNFonts (2)BmpNFonts

Font

Page 84: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com

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

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

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

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

Kombi-Objekte

Zusammensetzung aus elementaren Teilobjekten

Page 89: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com

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

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

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

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

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

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

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

Agenda GDI+ 3D-Grafik Schlußbemerkung

Page 97: Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH.NET Strategy & Developer Group franklan@microsoft.com

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

Fragen!?

Uff...Uff...