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

Post on 05-Apr-2015

106 views 0 download

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

Grafik-programmierung

GDI+, 3D

Frank LangeMicrosoft Deutschland GmbH

.NET Strategy & Developer Groupfranklan@microsoft.com

Agenda GDI+ 3D-Grafik Schlußbemerkung

Agenda GDI+

• Historie auf Microsoft-Systemen

• Unterschiede zu GDI

• Verwendung von GDI+

• Vektorgrafik Building Blocks

• Koordinaten und Transformationen

• Printing

• Bilddateien und Metafiles

3D-Grafik Schlußbemerkung

Das Historische Erlebnis

DOSWelcher Grafikkartentyp, welcher Grafikmode, was sind Latchregister, reich‘ mir mal das Programmierhandbuch des Druckerherstellers, gibt es einen schnelleren Integer-Algorithmus, hat‘s einen 387 oder 287, Postscript!, Prescribe…

Windows GDIHDC, SelectObject, ReleaseDC, SelectPalette,…

Windows GDI+Graphics g; g.DrawLine(..); g.RotateTransform(30)

Gibt‘s ja auch noch: OpenGL, GAPI, Direct3D, DirectDraw,…

Und sowieso - ist Grafik nicht etwas, das es zu beschreiben gilt, anstatt APIs und Methodenaufrufe zu initiieren?

GDI+ Verfügbarkeit

Windows XP: ja. Win98, WinME, NT4SP6, Win2K:

als Add-On .NET Framework: kein Ausweg!

Agenda GDI+

• Historie auf Microsoft-Systemen

• Unterschiede zu GDI

• Verwendung von GDI+

• Vektorgrafik Building Blocks

• Koordinaten und Transformationen

• Printing

• Bilddateien und Metafiles

3D-Grafik Schlußbemerkung

Unterschiede zu GDI

Graphics-Objekt statt DC Pens, Brushes,… sind unabhängig vom

Graphics-Objekt (Parameter statt selektiertes Objekt)

Koordinatentransformationen(endlich nicht mehr selbst zu programmieren)

Keine Current Position Alpha-Blending (Transparenz) Farbverläufe Imaging (JPEG etc.)

Agenda GDI+

• Historie auf Microsoft-Systemen

• Unterschiede zu GDI

• Verwendung von GDI+

• Vektorgrafik Building Blocks

• Koordinaten und Transformationen

• Printing

• Bilddateien und Metafiles

3D-Grafik Schlußbemerkung

Demo: Minimal

Graphics-Objekt

private void Form1_Paint(object sender, PaintEventArgs e){

Graphics g = e.Graphics;}

private void Form1_Paint(object sender, PaintEventArgs e){

Graphics g = e.Graphics;}

// auch:Graphics g = this.button1.CreateGraphics();

// auch:Graphics g = this.button1.CreateGraphics();

GDI+ und PrgSprachen

.NET WinForm-Projekte C++ Windows-Apps

#include <windows.h>#include <gdiplus.h> // link: GDIPLUS.LIB

using namespace Gdiplus;

VOID OnPaint(HDC hdc){

Graphics graphics(hdc); Pen pen(Color(255, 0, 0, 255));

graphics.DrawLine(&pen, 0, 0, 200, 100);}

#include <windows.h>#include <gdiplus.h> // link: GDIPLUS.LIB

using namespace Gdiplus;

VOID OnPaint(HDC hdc){

Graphics graphics(hdc); Pen pen(Color(255, 0, 0, 255));

graphics.DrawLine(&pen, 0, 0, 200, 100);}

Agenda GDI+

• Historie auf Microsoft-Systemen

• Unterschiede zu GDI

• Verwendung von GDI+

• Vektorgrafik Building Blocks

• Koordinaten und Transformationen

• Printing

• Bilddateien und Metafiles

3D-Grafik Schlußbemerkung

Demo: BuildingBlocks

Lines Rectangles Ellipses Arcs Polygons Cardinal Splines

Wie mit biegsamem Linieal gezogene Linie

Bézier splinesStart-, Endpunkt und zwei „magnetische“ Punkte in der Ferne

Agenda GDI+

• Historie auf Microsoft-Systemen

• Unterschiede zu GDI

• Verwendung von GDI+

• Vektorgrafik Building Blocks

• Koordinaten und Transformationen

• Printing

• Bilddateien und Metafiles

3D-Grafik Schlußbemerkung

Koordinatensysteme

PagePage

WorldWorld Beliebig positionier-, rotier- und skalierbar

Transfomationsmatrix speichert die Welttransformation

Ursprung links oben

Default: Pixel-Einheit, aber änderbar PageUnits (z.B. auf „2,54 cm“ umstellbar, DpiX, DpiY sind abfragbar – Größe der Grafikkarte;-)) PageScale zusätzlich für andere Auflösungseinheiten

DeviceDevice Ursprung links oben

Pixel als Einheit

Trafomatrix

3x3 – Matrix speichert gesamte Folge von Trafos (Translation, Rotation, Skalierung)

„Matrix Representation of Transformations“( .NET Framework Developer's Guide )

Demo: Trafo

g.Transform die Trafo-Matrix

g.TranslateTransform (dx,dy)g.TranslateTransform (dx,dy)

g.ScaleTransform (xMult, yMult)g.ScaleTransform (xMult, yMult)z.B: immer 1000*1000-Koordinatensystem (Egalisieren von Fenster, Drucker,…)

z.B: Ursprung in Mitte des Fensters setzen

g.RotateTransform (30)g.RotateTransform (30) z.B: y-Werte nach oben wachsend

Pen-Breite ist in Weltkoordinatenz.B. Auflösung auf DINA4-mm stellen und dann Pen in mm

Demo: Bewegung

Dito: Drawing ändert sich nicht, aber das Koordinatensystem („der Betrachter)

Double Buffering

Zappelfrei bei bewegter Darstellung

private void FormMain_Load(…){this.SetStyle( ControlStyles.DoubleBuffer

| ControlStyles.AllPaintingInWmPaint,true );

}

private void FormMain_Load(…){this.SetStyle( ControlStyles.DoubleBuffer

| ControlStyles.AllPaintingInWmPaint,true );

}

DoubleBufferDoubleBuffer Bild wird im Hintergrund aufgebaut

AllPaintingInWmPaintAllPaintingInWmPaintWM_ERASEBKGND führt noch nicht zum Löschen des Fensters

UserPaintUserPaintOS führt kein Caching des Inhalts aus.Bei schnellen Bewegungen wäre das unnötig.

Demo: ObjMover

Objekte, rotierbar und verschiebbar Anklicken eines Objekts erkennen Flicker-freie Darstellung

Demo: BenchLines

In GDI+ wird jeder Punkt über die Koordinatentransformation geschickt

Hier: Extrembeispiel Treppenstufen mit 3 Pixel langen Linien

Das ist der Preis für den Komfort! Anmerkung: zeitaufwendige Grafik

sollte den UI-Thread nicht blockieren…

Agenda GDI+

• Historie auf Microsoft-Systemen

• Unterschiede zu GDI

• Verwendung von GDI+

• Vektorgrafik Building Blocks

• Koordinaten und Transformationen

• Printing

• Bilddateien und Metafiles

3D-Grafik Schlußbemerkung

Standarddrucker (GDI)

GDI (ohne „+“)

PRINTDLG pdlg;

// Initmemset( &pdlg, 0, sizeof( PRINTDLG ) );pdlg.lStructSize = sizeof( PRINTDLG );

// Flag: ich möchte DCpdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC;

// Kein Show! PrintDlg( &pdlg ); // Da ist er: DCpdlg.hDC;

PRINTDLG pdlg;

// Initmemset( &pdlg, 0, sizeof( PRINTDLG ) );pdlg.lStructSize = sizeof( PRINTDLG );

// Flag: ich möchte DCpdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC;

// Kein Show! PrintDlg( &pdlg ); // Da ist er: DCpdlg.hDC;

..und nun gleich wieder vergessen!

Drucker wählen

Standarddrucker

PrintDialog dlg = new PrintDialog();dlg.Document = new PrintDocument();

MessageBox.Show ( dlg.PrinterSettings.PrinterName );

PrintDialog dlg = new PrintDialog();dlg.Document = new PrintDocument();

MessageBox.Show ( dlg.PrinterSettings.PrinterName );

Druckerwahl

PrintDialog dlg = new PrintDialog();dlg.Document = new PrintDocument();

if( dlg.ShowDialog()==DialogResult.OK)MessageBox.Show ( dlg.PrinterSettings.PrinterName );

PrintDialog dlg = new PrintDialog();dlg.Document = new PrintDocument();

if( dlg.ShowDialog()==DialogResult.OK)MessageBox.Show ( dlg.PrinterSettings.PrinterName );

.NET: PrintDialog liefert Druckerinfos, kein Graphics-Objekt

Standarddrucker (.NET)

PrintDocument, PrintPageEventHandler

PrintDocument doc = new PrintDocument(); // Default Printerdoc.PrintPage += new PrintPageEventHandler(MyPrintFunc);doc.Print(); // Empfehlenswert: try-catch-Szenario

void MyPrintFunc (object sender, PrintPageEventArgs e)

{

// nutze e.Graphics

e.HasMorePages = false;

}

PrintDocument doc = new PrintDocument(); // Default Printerdoc.PrintPage += new PrintPageEventHandler(MyPrintFunc);doc.Print(); // Empfehlenswert: try-catch-Szenario

void MyPrintFunc (object sender, PrintPageEventArgs e)

{

// nutze e.Graphics

e.HasMorePages = false;

}

PrintDocumentPrintDocument PrintPageEventHandler

Print mit Druckerwahl

PrintDialog, PrintDocument, MyFunc

PrintDocument doc = new PrintDocument();doc.PrintPage += new PrintPageEventHandler( MyPrintFunc );

PrintDialog dlg = new PrintDialog();dlg.Document = doc;

if (dlg.ShowDialog() == DialogResult.OK)doc.Print();

//----------------------------------------------------void MyPrintFunc (object sender, PrintPageEventArgs e){ //...}

PrintDocument doc = new PrintDocument();doc.PrintPage += new PrintPageEventHandler( MyPrintFunc );

PrintDialog dlg = new PrintDialog();dlg.Document = doc;

if (dlg.ShowDialog() == DialogResult.OK)doc.Print();

//----------------------------------------------------void MyPrintFunc (object sender, PrintPageEventArgs e){ //...}

Print Preview

PrintPreviewDialog

PrintDocument doc = new PrintDocument();doc.PrintPage += new PrintPageEventHandler( MyPrintFunc );

PrintPreviewDialog dlg = new PrintPreviewDialog();dlg.Document = doc;

dlg.ShowDialog();

//----------------------------------------------------void MyPrintFunc (object sender, PrintPageEventArgs e){ //...}

PrintDocument doc = new PrintDocument();doc.PrintPage += new PrintPageEventHandler( MyPrintFunc );

PrintPreviewDialog dlg = new PrintPreviewDialog();dlg.Document = doc;

dlg.ShowDialog();

//----------------------------------------------------void MyPrintFunc (object sender, PrintPageEventArgs e){ //...}

Demo: Printing

Print! Print… Print Preview

Agenda GDI+

• Historie auf Microsoft-Systemen

• Unterschiede zu GDI

• Verwendung von GDI+

• Vektorgrafik Building Blocks

• Koordinaten und Transformationen

• Printing

• Bilddateien und Metafiles

3D-Grafik Schlußbemerkung

Demo: Images

Bitmaps (JPG, GIF, BMP) Metafiles (EMF) (Demo: ObjMover)

Bitmap bitmap = new Bitmap("Grapes.jpg"); e.Graphics.DrawImage(bitmap, 60, 10);

Metafile metafile = new Metafile("SampleMetafile.emf"); e.Graphics.DrawImage(metafile, 60, 10);

Bitmap bitmap = new Bitmap("Grapes.jpg"); e.Graphics.DrawImage(bitmap, 60, 10);

Metafile metafile = new Metafile("SampleMetafile.emf"); e.Graphics.DrawImage(metafile, 60, 10);

Agenda GDI+ 3D-Grafik

• OpenGL

• Direct3D

Schlußbemerkung

Hinter den Bergen…

ArbeitArbeit

FunktionenFunktionen

MatheMatheIdeeIdeeIdeeIdee

ProgrammProgrammProgrammProgramm

Verstehen der/einer GrafikbibliothekProgrammrahmenEinige grundlegende Features

OpenGL vs. Direct3D

OpenGLOpenGL

OpenGL, Direct3DOpenGL, Direct3D

Direct3DDirect3D

• Ähnliche Features• Von Hardware beschleunigt• In .NET nutzbar

• Standard von Silicon Graphics• Das rote Buch: Addison-Wesley, „OpenGL Programming Guide“ © Silicon Graphics, Inc )• Gut sichtbare Grundfunktionalität

• SDK bringt neuen Projekttyp ins VS .NET - derzeit nicht in Everette Beta;-(•Objektklassen•Schnell und gut für Spiele•Nur Windows-Plattform

Agenda GDI+ 3D-Grafik

• OpenGL• Allgemeines

• Koordinaten und Transformationen

• Licht und Material

• Bitmaps, Images und Texturen

• Display Lists und Fonts

• 3D-Objekte

• Kamera (Bewegung durch den Raum)

• Direct3D

Schlußbemerkung

OpenGL als Standard

PlattformunabhängigPlattformunabhängig

OpenGL (TM)OpenGL (TM) Architectural Review Board

Unix, NT, Win95...

“Echtzeitgrafik”“Echtzeitgrafik” schnelle Algorithmen,kein Raytracing

Funktionsgruppen

Wiggle - Funktionen (MS)Wiggle - Funktionen (MS)

Core Set - FunktionenCore Set - Funktionen“gl”

“wgl”

Win32 - Funktionen (MS)Win32 - Funktionen (MS)ohne

“glu”

“aux”

Präfix

Utility - FunktionenUtility - Funktionen

Auxiliary - FunktionenAuxiliary - Funktionen

Datentypen

OpenGLOpenGL .NET.NET KennungKennung

GLbyte SByte b

GLint Int32 i

GLenum UInt32 ui

GLfloat Single f

GLdouble Double d

(Array) v

...

OpenGLOpenGL .NET.NET KennungKennung

GLbyte SByte b

GLint Int32 i

GLenum UInt32 ui

GLfloat Single f

GLdouble Double d

(Array) v

...

.NET z.B. System.Int32 (unabh. Von Programmiersprache) .NET z.B. System.Int32 (unabh. Von Programmiersprache)

Funktionsnamen

API-PräfixAPI-Präfix Parametertyp-PostfixParametertyp-PostfixNameName

(falls versch. Versionen)

Beispiel

glVertex3dv Core Set API

“Vertex”-Funktion

3 double-Werte als Array

void glVertex3dv( double[] v);

glVertex3dv Core Set API

“Vertex”-Funktion

3 double-Werte als Array

void glVertex3dv( double[] v);

--> Online Hilfe: z.B. glVertex, glGet

Rendering Context

Color Buffer( DC )

Color Buffer( DC )

Depth Buffer(z-Buffer)

Depth Buffer(z-Buffer)

sonstigePuffer

sonstigePuffer

x,yx,y x,yx,y x,yx,y

Frame BufferFrame Buffer

3D-Programmierung

RENDERINGRENDERING

CONTEXTCONTEXTEinstellungen (Licht...)Einstellungen (Licht...)

OpenGL unter .NET

Noch kein offizielles MS-Assembly Verschiedenes im Internet:

• GLSharp (http://www.headbits.com/)

• CsGL (http://sourceforge.net/projects/csgl)

• … Tatsächlich benötigt

• Deklarationen der OpenGL-Funktionen und Datentypen

• Aux-Funktionen über DLL statt statischer native Code Library

• Hilfe für RC-Benutzung „Altbekannte“ OpenGL-Programmierung

in .NET-Apps – kaum Unterschied zu SDK-Apps

Agenda GDI+ 3D-Grafik

• OpenGL• Allgemeines

• Koordinaten und Transformationen

• Licht und Material

• Bitmaps, Images und Texturen

• Display Lists und Fonts

• 3D-Objekte

• Kamera (Bewegung durch den Raum)

• Direct3D

Schlußbemerkung

Koordinatensystem

Y

-Z

X

Daumen

Zeigefinger

Mittelfinger+z

Rechtssystem rechte Hand-Regel

Welt-, Modellkoordinaten

Y

-Z

X

WC

MCY

-Z

1

1

1

X

Modellkoordinaten

(Arbeitskoordinaten)

Weltkoordinatensystem (immer fix)

Transformationen

Rotation (Drehen)Rotation (Drehen)

Translation (Verschieben)Translation (Verschieben)

Skalierung (Dehnen/Stauchen)Skalierung (Dehnen/Stauchen)

glTranslate

glRotate

glScale

MC für Objektausgabe vorbereiten

„Aux“-Objekte

auxSolidTeapot Teekessel

auxWireTeapot -”- Drahtmodell

auxSolidCube Würfel

auxWireCube -”- Drahtmodell

...

Anmerkung: Aux-Funktionen heißen in GLSharp glut-Funktionen.Anmerkung: Aux-Funktionen heißen in GLSharp glut-Funktionen.

Demo: Transformations

.NET-Rahmenstatic void Paint ()

{

glTranslated (0,0,-5);

glRotated (30,0,0,1);

glRotated (20,1,0,0);

Aux.WireTeapot (1.0);

}

static void Paint ()

{

glTranslated (0,0,-5);

glRotated (30,0,0,1);

glRotated (20,1,0,0);

Aux.WireTeapot (1.0);

}

Transformations

ShowThis.cs

Form1.cs

Demo: MoveMCMoveMC

Tastatur-Steuerung

MoveMC.exeMoveMC.exe

Voreinstellungen

Sichtbereich im WCSichtbereich im WC

Geräte-AusgabebereichGeräte-Ausgabebereich

Y

X

-Z

Window

glFrustum / gluPerspective

glViewport

Sichtbarer Bereich

Sichtbereich im WCSichtbereich im WC

Y

X

-Z

glFrustum / gluPerspective

glMatrixMode ( GL_PROJECTION);glFrustum ( links, rechts, unten, oben, zStart, zEnde );

glMatrixMode ( GL_PROJECTION);glFrustum ( links, rechts, unten, oben, zStart, zEnde );

glMatrixMode ( GL_PROJECTION);gluPerspective (

öffnungWinkel, y_zu_x_Aspect,zStart, zEnde );

glMatrixMode ( GL_PROJECTION);gluPerspective (

öffnungWinkel, y_zu_x_Aspect,zStart, zEnde );

Oder:

-Z

15°

15°

-z * sin(15°)

0

Geräte-Ausgabebereich

Y

X

-Z

WindowglViewport ( 0,0,

windowWidth, windowHeight);

glViewport ( 0,0, windowWidth, windowHeight);

Geräte-AusgabebereichGeräte-Ausgabebereich

glViewport

Trafo-Pipeline

Y

X

-Z

MC1

Window

Object Coordinates (MC)

Eye Coordinates (WC)

Windows Coordinates

Clip Coordinates

(Fläche)

Modelview TrafoModelview TrafoProjection TrafoProjection Trafo

Viewport TrafoViewport Trafo

11

2233

44

Wo sind die Trafo-Infos?

Modelview TrafoModelview Trafo

Projection TrafoProjection Trafo

Viewport TrafoViewport Trafo

Modelview Matrix

Projection Matrix

x,y, width, height

Matrix: mathematische Datenstruktur, die alle Tranformationenseinstellungen speichert

Zugriff auf Einstellungen

Modelview TrafoModelview Trafo

Projection TrafoProjection Trafo

Viewport TrafoViewport Trafo

glMatrixMode (GL_MODELVIEW)glLoadIdentity, glTranslated, glRotated, glScaled,...

glMatrixMode (GL_PROJECTION)glLoadIdentity, glFrustum,...

glViewport

Aktuellen Einstellung zählen

--> glLoadItentity wirkt im aktuellen Matrixmode

OpenGL als State MachineOpenGL als State MachineAbfrage über glGetGL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX, GL_VIEWPORT

ZwischenspeichernglPushMatrix(), glPopMatrix()

Abfrage über glGetGL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX, GL_VIEWPORT

ZwischenspeichernglPushMatrix(), glPopMatrix()

Demo: SDK_Minimal

CreateCreate

SizeSize

PaintPaint

CreateWindow DC bekommen

SetPixelFormat DC vorbereiten

wglCreateContext RC erzeugen

glViewport Ausgabebereich

glFrustum Sichtbereich

glClear Frame Buffer löschen

glTranslated... MC transformieren

auxSolidTeapot... Objekt ausgeben

glFlush Ausgabe fertig

wglDeleteContext RC zerstörenDestroyDestroy

Demo: NET_Minimal

LoadLoad

SizeChangedSizeChanged

PaintPaint

Render Contexterzeugen

Sichtbarkeitsbereich undFensterbereicheinstellen

ClearBuffer()

MC-TrafosObjekte ausgeben

SwapBuffer()

Demo: NET_Bewegt

Bewegtes BildBewegtes Bild

Timer_Tick globale Paramter ändernInvalidate()

Form_Load myForm.SetStyle( ControlStyles.Opaque, true );

Fensterbereich nicht löschen(„Zappelei“), sondern nurOpenGL Buffer einblenden

TimerTimer

WinFormWinForm

Eigene Objekte

OpenGLOpenGL

Punkt

Linie

Polygon

(Dreieck, Viereck)

Oberflächen-elemente

3D Objekt3D Objekt

bisher: “aux”-Objekte

Fläche übergeben

glBegin (GL_POLYGON); //Würfel vorne

glVertex3d (+1,+1,+1); //r o

glVertex3d (-1,+1,+1); //l o

glVertex3d (-1,-1,+1); //l u

glVertex3d (+1,-1,+1); //r u

glEnd ();

glBegin (GL_POLYGON); //Würfel vorne

glVertex3d (+1,+1,+1); //r o

glVertex3d (-1,+1,+1); //l o

glVertex3d (-1,-1,+1); //l u

glVertex3d (+1,-1,+1); //r u

glEnd (); -1,-1,1-1,-1,1 1,-1,11,-1,1

1,1,11,1,1-1,1,1-1,1,1

Linksumlauf

OpenGLPipeline

OpenGLPipeline

Fläche & Normale

glBegin (GL_POLYGON); //Würfel vorne

glNormal3d (0,0,1);glNormal3d (0,0,1);

glVertex3d (+1,+1,+1); //r o

glVertex3d (-1,+1,+1); //l o

glVertex3d (-1,-1,+1); //l u

glVertex3d (+1,-1,+1); //r u

glEnd ();

glBegin (GL_POLYGON); //Würfel vorne

glNormal3d (0,0,1);glNormal3d (0,0,1);

glVertex3d (+1,+1,+1); //r o

glVertex3d (-1,+1,+1); //l o

glVertex3d (-1,-1,+1); //l u

glVertex3d (+1,-1,+1); //r u

glEnd ();-1,-1,1-1,-1,1 1,-1,11,-1,1

1,1,11,1,1-1,1,1-1,1,1

Linksumlauf

* senkrecht von Oberfläche weg

* z.B. für Lichtabstrahlung wichtig

NormalvektorNormalvektor

Demo: Wuerfel

Würfel ohne Licht und Material

Agenda GDI+ 3D-Grafik

• OpenGL• Allgemeines

• Koordinaten und Transformationen

• Licht und Material

• Bitmaps, Images und Texturen

• Display Lists und Fonts

• 3D-Objekte

• Kamera (Bewegung durch den Raum)

• Direct3D

Schlußbemerkung

Licht & Material

ambientes Lichtambientes Licht bis 8 Lichtquellenbis 8 Lichtquellen

Material-EigenschaftenMaterial-Eigenschaften

Farbe im Color Buffer

glEnable ( GL_LIGHTING )glEnable ( GL_LIGHTING )

glEnable ( GL_LIGHT0 )...glEnable ( GL_LIGHT0 )...

Licht-Arten

ambientes Lichtambientes Licht

diffuses Lichtdiffuses Licht

Spekulares LichtSpekulares Licht

“Emittiertes Licht”“Emittiertes Licht”

keine Einfallsrichtung (im Raum verteilt)

keine Abstrahlrichtung

Einfallsrichtung (--> Schräge der Fläche)

keine Abstrahlrichtung

Einfallsrichtung (--> Schräge der Fläche)

Ausfallsrichtung (--> Lage zum Betrachter)

Unabhängige Materialfarbe

Ambientes Licht (global)

glLightModelfv (GL_LIGHT_MODEL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } );

glLightModelfv (GL_LIGHT_MODEL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } );

Interne BerechnungBeispiel: Rot-Wert: RDarstellung = RGlobalAmbient * RMaterial + RLight0 *

Rmaterial

Lichtquellen 0..7

glLightfv ( GL_LIGHT0, GL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } );

glLightfv ( GL_LIGHT0, GL_DIFFUSE, new float[] { 0.4f, 0.4f, 0.4f, 1.0f } );

glLightfv ( GL_LIGHT0, GL_SPECULAR, new float[] { 0.5f, 0.5f, 0.5f, 1.0f });

glLightfv ( GL_LIGHT0, GL_POSITION, new float[] { 0.0f, 0.0f, 1.0f, 1.0f } );

//1=nahes Licht //0=fernes Licht

glEnable ( GL_LIGHT0 );

glLightfv ( GL_LIGHT0, GL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } );

glLightfv ( GL_LIGHT0, GL_DIFFUSE, new float[] { 0.4f, 0.4f, 0.4f, 1.0f } );

glLightfv ( GL_LIGHT0, GL_SPECULAR, new float[] { 0.5f, 0.5f, 0.5f, 1.0f });

glLightfv ( GL_LIGHT0, GL_POSITION, new float[] { 0.0f, 0.0f, 1.0f, 1.0f } );

//1=nahes Licht //0=fernes Licht

glEnable ( GL_LIGHT0 );

Material

glMaterialfv ( GL_FRONT, GL_AMBIENT, new float[] { 0.4f, 0.4f, 0.0f, 1.0f } );

glMaterialfv ( GL_FRONT, GL_DIFFUSE, new float[] { 0.7f, 0.7f, 0.7f, 1.0f } );

// RGBA!

glMaterialfv ( GL_FRONT, GL_SPECULAR, new float[] { 0.9f, 0.9f, 0.9f, 1.0f } );

glMaterial ( GL_FRONT, GL_SHININESS, 10.0 );

glMaterialfv ( GL_FRONT, GL_EMISSION, new float[] { 0.0f, 0.0f, 0.0f, 1.0f } );

auxSolidCube (1.0);

glMaterialfv ( GL_FRONT, GL_AMBIENT, new float[] { 0.4f, 0.4f, 0.0f, 1.0f } );

glMaterialfv ( GL_FRONT, GL_DIFFUSE, new float[] { 0.7f, 0.7f, 0.7f, 1.0f } );

// RGBA!

glMaterialfv ( GL_FRONT, GL_SPECULAR, new float[] { 0.9f, 0.9f, 0.9f, 1.0f } );

glMaterial ( GL_FRONT, GL_SHININESS, 10.0 );

glMaterialfv ( GL_FRONT, GL_EMISSION, new float[] { 0.0f, 0.0f, 0.0f, 1.0f } );

auxSolidCube (1.0);

Demo: LichtMaterial (1)LichtMaterial

Sample 1..15

Lichtquellen und Materialeigenschaften.

Licht BetrachterNormale,

hier aucheLicht+Betrachter

Spotlight

float fDirection[] = { 0.0f, 0.0f, -1.0f };

glLightfv ( GL_LIGHT0, GL_SPOT_DIRECTION, fDirection );//Richtung

glLightf ( GL_LIGHT0, GL_SPOT_CUTOFF, 15.0f ); //Öffnungswinkel

glLightf ( GL_LIGHT0, GL_SPOT_EXPONENT, 0.0f ); //Fokussierung

float fDirection[] = { 0.0f, 0.0f, -1.0f };

glLightfv ( GL_LIGHT0, GL_SPOT_DIRECTION, fDirection );//Richtung

glLightf ( GL_LIGHT0, GL_SPOT_CUTOFF, 15.0f ); //Öffnungswinkel

glLightf ( GL_LIGHT0, GL_SPOT_EXPONENT, 0.0f ); //Fokussierung

Nahe Lichtquelle als “Taschenlampe”Nahe Lichtquelle als “Taschenlampe”

Exponent =0 --> immer Faktor 1

sonst: je senkrechter Licht, desto stärker

entfernt weniger Licht

Nahe Lichtquelle als “Taschenlampe”Nahe Lichtquelle als “Taschenlampe”

glLightf ( GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0f );

glLightf ( GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0f );

glLightf ( GL_LIGHT0, GL_QUDRATIC_ATTENUATION, 0.0f );

glLightf ( GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0f );

glLightf ( GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0f );

glLightf ( GL_LIGHT0, GL_QUDRATIC_ATTENUATION, 0.0f );

konstant unabhängig von Entfernung schwächeres Licht

linear mit Entfernung gleichmäßige Lichtabnahme

quadratisch mit Entfernung raschere Lichtabnahme

Alles wirkt zusammenAlles wirkt zusammen

Nebel

float fRGB[] = { 0.1f, 0.1f, 0.1f };

glFogi ( GL_FOG_MODE, GL_EXP ); // exponentiell mit Entfernung

glFogfv ( GL_FOG_COLOR, fRGB ); // Nebelfarbe

glFogf ( GL_FOG_DENSITY, 0.15 ); // Nebeldichte

glEnable ( GL_FOG );

float fRGB[] = { 0.1f, 0.1f, 0.1f };

glFogi ( GL_FOG_MODE, GL_EXP ); // exponentiell mit Entfernung

glFogfv ( GL_FOG_COLOR, fRGB ); // Nebelfarbe

glFogf ( GL_FOG_DENSITY, 0.15 ); // Nebeldichte

glEnable ( GL_FOG );

Näher --> MaterialfarbeFerner --> Nebelfarbe

Näher --> MaterialfarbeFerner --> Nebelfarbe

Transparentes Material

RGBARGBA A = Alpha-Wert

Alpha BlendingAlpha Blending Vorhandene, weiter entfernte Pixel im Frame Buffer:

* nicht überschreiben

* “durchscheinen” lassen

i.a.: Alpha = 1 --> undurchsichtig

z.B. Alpha = 0.2 --> 80% von dahinterliegendender Pixelfarbe

i.a.: Alpha = 1 --> undurchsichtig

z.B. Alpha = 0.2 --> 80% von dahinterliegendender Pixelfarbe

ff transparentes Material

glEnable ( GL_BLEND );

glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

float fDiffuse[] = {0.9f, 0.9f, 0.9f, 0.7f ); // Alpha=0.7

glMaterialfv ( GL_FRONT, GL_DIFFUSE, fDiffuse );

auxSolidShere (1.0); // Überschreibt nicht gnadenlos

// weiter entfernte Teile

glEnable ( GL_BLEND );

glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

float fDiffuse[] = {0.9f, 0.9f, 0.9f, 0.7f ); // Alpha=0.7

glMaterialfv ( GL_FRONT, GL_DIFFUSE, fDiffuse );

auxSolidShere (1.0); // Überschreibt nicht gnadenlos

// weiter entfernte Teile

Back Face Culling

Back Face CullingBack Face Culling

Rückseiten der Flächen werden nicht gezeichnet.

Ausschalten

glDisable ( GL_CULL_FACE ); //keine Anzeigeunterdrückung

glLightModeli ( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); //auch Lichtberechnungen

glDisable ( GL_CULL_FACE ); //keine Anzeigeunterdrückung

glLightModeli ( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); //auch Lichtberechnungen

Demo: LichtMaterial (2)LichtMaterial

Sample 17..

Alpha-Blending, Back Face Culling

Agenda GDI+ 3D-Grafik

• OpenGL• Allgemeines

• Koordinaten und Transformationen

• Licht und Material

• Bitmaps, Images und Texturen

• Display Lists und Fonts

• 3D-Objekte

• Kamera (Bewegung durch den Raum)

• Direct3D

Schlußbemerkung

OpenGL Bitmaps

Nix bunt! ( „Bit“-Map) 1er-Bits = aktuelle Farbe Keine Trafo (Drehen…)

glRasterPosglRasterPos

glBitmapglBitmap

Ausgabeposition im MC

Darstellung

Parameter: Adresse der Pixel,...

Images

Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B Keine Trafo (Drehen…)

glRasterPosglRasterPos

glDrawPixelsglDrawPixels

Ausgabeposition im MC

Darstellung

Parameter: Adresse der Pixel,...

Win32 BMPs: Blue-Green-Red-Reihenfolge!

Texturen

Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B Höhe, Breite: 2n-Wert Überzieht eine Objekt-Fläche Mit der Fläche transformiert (gedreht…)

Win32 BMPs: Blue-Green-Red-Reihenfolge!

glEnable ( GL_TEXTURE_2D )glEnable ( GL_TEXTURE_2D )

glTexImage2DglTexImage2D

Texturen verwendbar

Pixelarray übergeben

Textur auf FlächeglBegin (GL_POLYGON); //Fläche

glNormal3d (0,0,1);

glTexCoord2d ( 0.6, 0.5);glTexCoord2d ( 0.6, 0.5);

glVertex3d (1,1,0); //r o

glTexCoord2d ( 0.2, 0.5);glTexCoord2d ( 0.2, 0.5);

glVertex3d (-1,1,0); //l o

glTexCoord2d ( 0.2, 0.1);glTexCoord2d ( 0.2, 0.1);

glVertex3d (-1,-1,0); //l u

glTexCoord2d ( 0.6, 0.1);glTexCoord2d ( 0.6, 0.1);

glVertex3d (1,-1,0); //r u

glEnd ();

glBegin (GL_POLYGON); //Fläche

glNormal3d (0,0,1);

glTexCoord2d ( 0.6, 0.5);glTexCoord2d ( 0.6, 0.5);

glVertex3d (1,1,0); //r o

glTexCoord2d ( 0.2, 0.5);glTexCoord2d ( 0.2, 0.5);

glVertex3d (-1,1,0); //l o

glTexCoord2d ( 0.2, 0.1);glTexCoord2d ( 0.2, 0.1);

glVertex3d (-1,-1,0); //l u

glTexCoord2d ( 0.6, 0.1);glTexCoord2d ( 0.6, 0.1);

glVertex3d (1,-1,0); //r u

glEnd ();

10

1

0.2 0.6

0.1

0.5

t

s

Rahmen: Ziel-Fläche

eines 3D-Objekts

Demo: BmpNFonts (1)BmpNFonts

Bitmap

Image

Texture

(Font kommt später)

Agenda GDI+ 3D-Grafik

• OpenGL• Allgemeines

• Koordinaten und Transformationen

• Licht und Material

• Bitmaps, Images und Texturen

• Display Lists und Fonts

• 3D-Objekte

• Kamera (Bewegung durch den Raum)

• Direct3D

Schlußbemerkung

Display Lists

Anweisungsfolgen OpenGL-Verwaltung

Abruf mit Index (RC-lokal!)

glNewList (inx,GL_COMPILE)

// OpenGL-Anweisungen

glEndList ()

glNewList (inx,GL_COMPILE)

// OpenGL-Anweisungen

glEndList ()

glDeleteLists (inxFirst, nCount)glDeleteLists (inxFirst, nCount)

glCallList (inx)

glListBase ( inxOffset )glCallLists ( nCount, GL_INT, inxArr )

glCallList (inx)

glListBase ( inxOffset )glCallLists ( nCount, GL_INT, inxArr )

True Type Fonts

wglUseFontOutlineswglUseFontOutlines

Erzeugt Display List für jeden Glyphen (Zeichendarstellung)

glCallListsglCallLists

Anzeige eines String. String als Indexarray für die Display Lists der Glyphen

Demo: BmpNFonts (2)BmpNFonts

Font

Agenda GDI+ 3D-Grafik

• OpenGL• Allgemeines

• Koordinaten und Transformationen

• Licht und Material

• Bitmaps, Images und Texturen

• Display Lists und Fonts

• 3D-Objekte

• Kamera (Bewegung durch den Raum)

• Direct3D

Schlußbemerkung

Flächenelemente

Nicht erlaubtNicht erlaubt

0

12

3

4

Einkerbung

Ausstanzung

Rechts-Umlaufsinn

Nein !Nein !

Nein !Nein !

Nein !Nein !

Einfache Elemente

Flächen direkt programmierbar

• Würfel

• Pyramide

• …

Berechnete Objekte

Flächenelemente berechnen

• Kugel

• Rohr

• …

Punktegitter erzeugen

Die benachbarten Punkte umschließen eine Fläche (vgl. auxWireSphere...)

oftoft

Kombi-Objekte

Zusammensetzung aus elementaren Teilobjekten

Objekte scannen

Prinzip: Thomograf

PunktegitterTexturFarben

PunktegitterTexturFarben

Echoabstastung für Koordinaten

+

Kamera für Texturelemente

+

Lichtreflexion messenfür Material,Normalen

Demo: ObjectsObjects

KombiObjects

RobotMSJ

RobotMSJ stammt vom MSDN.

Agenda GDI+ 3D-Grafik

• OpenGL• Allgemeines

• Koordinaten und Transformationen

• Licht und Material

• Bitmaps, Images und Texturen

• Display Lists und Fonts

• 3D-Objekte

• Kamera (Bewegung durch den Raum)

• Direct3D

Schlußbemerkung

Demo: MoveCamera

Implementierung

Fall: Kamera schwenkt nach rechts

--> ganze Szene dreht sich nach links

--> MC-System vor der Objektdarstellung nach links rotieren

dito: sonstige Bewegung

Agenda GDI+ 3D-Grafik

• OpenGL• Allgemeines

• Koordinaten und Transformationen

• Licht und Material

• Bitmaps, Images und Texturen

• Display Lists und Fonts

• 3D-Objekte

• Kamera (Bewegung durch den Raum)

• Direct3D

Schlußbemerkung

Direct3D

Schnelle 3D-Grafik auf Windows-Systemen

Gerne für Spiele verwendet Rendering Engine mit Objektmodell Projekttyp im VS .NET …

3D Beschreibungsformat

Z.B. 3D-Grafik über das Internetvia 3D-Modell-Beschreibungsformat

• VRML, ISO Standard seit 1997(Virtual Reality Modeling Language)• Soll ersetzt werden, weil XML erwünscht

• Cosmo Player (Platinium) als IE-Plugin

• Beispiele, siehehttp://www.ocnus.com/models/Buildings/

• X3D (eXtensible 3D)Wird als VRML-Nachfolger gesehen

• Siehe auch www.web3d.org

Agenda GDI+ 3D-Grafik Schlußbemerkung

Zusammenfassung

GDI+ wird in WinForms verwendet GDI+ nutzt Transformationsmatrizen

OpenGL und Direct3D ermöglichen 3D-Grafik

Transformationen sind das A&O Objekte werden im durch

Flächenelemente beschrieben Verschiedene Lichtquellen für

plastische Darstellung

Fragen!?

Uff...Uff...