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

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

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.

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...