Grafik- programmierung GDI+, 3D

Slides:



Advertisements
Ähnliche Präsentationen
Computer Graphics Shader
Advertisements

Konzeptioneller Vergleich von VRML, Java3D und OpenGL hinsichtlich ihrer Eignung zur Erstellung von Animationen von Christian Stein.
Objektorientierte Programmierung
DI Christian Donner cd (at) donners.com
Kapselung , toString , equals , Java API
Grundlagen der Geometrie
Graphische Datenverarbeitung IV Dr. Markus Heitz.
FH-Hof Einbindung von JavaScript Anweisungen
FH-Hof Texturen Richard Göbel. FH-Hof Anwendungen von Texturen Darstellung von 2D-Bildern Gestaltung von Oberflächen Simulation komplexer Geometrien...
FH-Hof Geometrie Richard Göbel. FH-Hof Aufbau des virtuellen Universums.
Java2D Richard Göbel.
Java: Dynamische Datentypen
Java: Grundlagen der Sprache
FH-Hof Java3D - Grundlagen Richard Göbel. FH-Hof Java3D Konzept Erzeugung eines Szenengraphen als virtuelle Welt Darstellung der virtuellen Welt mit Hilfe.
FH-Hof Texturen Richard Göbel. FH-Hof Anwendungen von Texturen Darstellung von 2D-Bildern Gestaltung von Oberflächen Simulation komplexer Geometrien...
FH-Hof Java 2D - Kontext für Zeichenoperationen Richard Göbel.
Phong Shading (Normaleninterpolation)
OGRE Object-Oriented Graphics Rendering Engine Szenen-orientierte, flexible 3D Engine in C++ Hardware-beschleunigte 3D Grafiken Unterstützt Direct3D und.
Sommersemester 2003 Lars Bernard
Java3d „Licht und Material“
AWT – Detailbetrachtung Java 3D – Seminar im Wintersemester 2002/2003 Christian Schneider.
Diskrete Mathematik I Vorlesung Arrays-
Java-Kurs Grafik Julian Drerup.
Programmieren mit JAVA Teil V. Grafikausgabe mit JAVA, das AWT Java wurde von Anfang an mit dem Anspruch entwickelt, ein vielseitiges, aber einfach zu.
Introducing the .NET Framework
OpenGL mit Delphi Allgemeines OpenGL-Funktionsbezeichnungen
Einführung in Visual C++
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
DVG Klassen und Objekte
Computergrafik Vom Dreieck zum Ego-Shooter Olaf Müller
Special Effects Realistischeres Rendern einer Scene.
Struktur-Funktions-Modelle von Pflanzen - Sommersemester Winfried Kurth Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik.
Grafikformate Nicolas Ruh.
FHP - Fachbereich Bauingenieurwesen
Computergraphik mit OpenGL Einführung. Bilder Objekt existiert im Raum unabhängig vom Betrachter Objekte sind beschrieben durch die Position verschiedener.
Einsteigerkurs Andy Reimann - Mai Intro Trailer.
XNA 3D Tutorial Anzeigen eines Objektes. Inhalt Lernen Sie, wie Sie Modelle implementieren. Initializing Lernen Sie, wie Sie Modelle aus der Content Directory.
Java ohne Kara. Java ohne Kara Ab jetzt: Java ohne Kara Ziel: Erfahrungen sammeln mit ersten Java Programmen.
Textfelder, Grafiken,... Verschieden Übungen Schreibe als Untertitel:
Hi Zusammen! Ich möchte eine Graphik in PP erstellen, die wie ein Tacho funktioniert. Das heisst, das Tacho ist gegeben, aber der Pfeil soll sich durch.
Computergrafik - Inhalt
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
Effekte 1 Universität zu Köln Historisch Kulturwissenschaftliche Informationsverarbeitung Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Windows Presentation Foundation, Vorlesung Wintersemester 2013/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 2 Folie 2 XAML (1) s.a.
Camera, Lights, Action… Dirk Primbs Developer Evangelist
Bildbearbeitung Nicolas Ruh.
Objekte und ihre Beschreibung
Oliver Spritzendorfer Thomas Fekete
Helwig Hauser Teil 12: Zusammenfassung All CGR4 revisited.
Parallelisierung für Multiprozessor-Maschinen
Textfelder, Grafiken,... Schreibe als Untertitel:
Theorie Praktische Beispiele
Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 1 SFZ FN Sj. 13/14 Python Klassen und Objekte.
Lisa Blum - Kathrin Kunze - Michael Kreil
Erfahrungen mit Microsoft DirectX 8 W. Krug, April 2002.
Schaltfläche-Star 1 Schaltfläche Star. Schaltfläche-Star 2 Beispiel Star Erstellen eines grünen Rechtecks: Hintergrund auf Größe 200x50 Pixel minimieren,
Die Welt der Shader Universität zu Köln WS 14/15 Softwaretechnologie II (Teil 1) Prof. Dr. Manfred Thaller Referent: Lukas Kley Fortgeschrittene Techniken.
3D Graphics APIs: OpenGL & Fixed Function Pipeline
Die Renderpipeline.
Multimedia und Virtual Reality Vorlesung am Martin Kurze Multimedia in 3D.
Java-Kurs Übung Besprechung der Hausaufgabe
Grundlagen der Geometrie
und Informationen über den Scanner
 Einführung  Szenengraphen  Bestandteile  Eingabe  JOGL  LWJGL  Beispiele  ARDOR3D Games 04/23/12Ardor 3D – Holzwarth/Kau 2.
Java Programme nur ein bisschen objektorientiert.
Einführung in OpenGL Seminarvortrag im Rahmen des Bachelorstudiengangs „Scientific Programming“ Tural Bilalov.
 Präsentation transkript:

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

Agenda GDI+ 3D-Grafik Schlußbemerkung

Agenda GDI+ 3D-Grafik Schlußbemerkung 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 DOS Welcher 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 GDI HDC, 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+ 3D-Grafik Schlußbemerkung 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+ 3D-Grafik Schlußbemerkung 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; } // 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); }

Agenda GDI+ 3D-Grafik Schlußbemerkung 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 splines Start-, Endpunkt und zwei „magnetische“ Punkte in der Ferne

Agenda GDI+ 3D-Grafik Schlußbemerkung 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 World Page Device Beliebig positionier-, rotier- und skalierbar Transfomationsmatrix speichert die Welttransformation Page 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 Device 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 z.B: immer 1000*1000-Koordinatensystem (Egalisieren von Fenster, Drucker,…) g.ScaleTransform (xMult, yMult) g.TranslateTransform (dx,dy) z.B: Ursprung in Mitte des Fensters setzen g.RotateTransform (30) z.B: y-Werte nach oben wachsend Pen-Breite ist in Weltkoordinaten z.B. Auflösung auf DINA4-mm stellen und dann Pen in mm

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

AllPaintingInWmPaint Double Buffering Zappelfrei bei bewegter Darstellung DoubleBuffer Bild wird im Hintergrund aufgebaut WM_ERASEBKGND führt noch nicht zum Löschen des Fensters AllPaintingInWmPaint OS führt kein Caching des Inhalts aus. Bei schnellen Bewegungen wäre das unnötig. UserPaint private void FormMain_Load(…) { this.SetStyle( ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true ); }

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+ 3D-Grafik Schlußbemerkung 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; // Init memset( &pdlg, 0, sizeof( PRINTDLG ) ); pdlg.lStructSize = sizeof( PRINTDLG ); // Flag: ich möchte DC pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC; // Kein Show! PrintDlg( &pdlg ); // Da ist er: DC pdlg.hDC; ..und nun gleich wieder vergessen!

MSDN TechTalk – <<Monat JJJJ>> <<Thema>> 23 Drucker wählen MSDN TechTalk – <<Monat JJJJ>> <<Thema>> 23 .NET: PrintDialog liefert Druckerinfos, kein Graphics-Objekt Standarddrucker PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); MessageBox.Show ( dlg.PrinterSettings.PrinterName ); Druckerwahl SDK: PRINTDLG pdlg; // Initialize the PRINTDLG structure. memset( &pdlg, 0, sizeof( PRINTDLG ) ); pdlg.lStructSize = sizeof( PRINTDLG ); // Set the flag to return printer DC. pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC; // Invoke the printer dialog box. PrintDlg( &pdlg ); // hDC member of the PRINTDLG structure contains // the printer DC. return pdlg.hDC; PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); if( dlg.ShowDialog()==DialogResult.OK) MessageBox.Show ( dlg.PrinterSettings.PrinterName );

Standarddrucker (.NET) PrintDocument, PrintPageEventHandler PrintDocument doc = new PrintDocument(); // Default Printer doc.PrintPage += new PrintPageEventHandler(MyPrintFunc); doc.Print(); // Empfehlenswert: try-catch-Szenario void MyPrintFunc (object sender, PrintPageEventArgs e) { // nutze e.Graphics e.HasMorePages = false; } PrintDocument 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) { //... }

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) { //... }

Demo: Printing Print! Print… Print Preview

Agenda GDI+ 3D-Grafik Schlußbemerkung 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);

Agenda GDI+ 3D-Grafik OpenGL Direct3D Schlußbemerkung

Hinter den Bergen… Programm Idee Verstehen der/einer Grafikbibliothek Programmrahmen Einige grundlegende Features Programm Arbeit Funktionen Mathe Idee

OpenGL vs. Direct3D OpenGL Direct3D Ähnliche Features OpenGL, Direct3D Von Hardware beschleunigt In .NET nutzbar OpenGL 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 Direct3D

Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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 OpenGL (TM) Plattformunabhängig “Echtzeitgrafik” Architectural Review Board Plattformunabhängig Unix, NT, Win95... “Echtzeitgrafik” schnelle Algorithmen, kein Raytracing

Funktionsgruppen Präfix Core Set - Funktionen Wiggle - Funktionen (MS) “wgl” Win32 - Funktionen (MS) ohne Utility - Funktionen “glu” Auxiliary - Funktionen “aux”

Datentypen OpenGL .NET Kennung 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)

Funktionsnamen API-Präfix Name Parametertyp-Postfix (falls versch. Versionen) Beispiel glVertex3dv Core Set API “Vertex”-Funktion 3 double-Werte als Array  void glVertex3dv( double[] v); --> Online Hilfe: z.B. glVertex, glGet

Einstellungen (Licht...) Rendering Context 3D-Programmierung Einstellungen (Licht...) RENDERING CONTEXT Frame Buffer Color Buffer ( DC ) Depth Buffer (z-Buffer) sonstige Puffer x,y x,y x,y

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 Schlußbemerkung OpenGL Direct3D 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 Rechtssystem Y -Z X +z rechte Hand-Regel Zeigefinger Daumen Mittelfinger

Welt-, Modellkoordinaten Y Modellkoordinaten (Arbeitskoordinaten) MC 1 -Z 1 Y -Z X X 1 WC Weltkoordinatensystem (immer fix)

Transformationen MC für Objektausgabe vorbereiten Translation (Verschieben) glTranslate Rotation (Drehen) glRotate Skalierung (Dehnen/Stauchen) glScale

„Aux“-Objekte auxSolidTeapot Teekessel auxWireTeapot -”- Drahtmodell auxSolidCube Würfel auxWireCube -”- Drahtmodell ... Anmerkung: Aux-Funktionen heißen in GLSharp glut-Funktionen.

Demo: Transformations .NET-Rahmen static void Paint () { glTranslated (0,0,-5); glRotated (30,0,0,1); glRotated (20,1,0,0); Aux.WireTeapot (1.0); } Form1.cs ShowThis.cs

Demo: MoveMC MoveMC Tastatur-Steuerung MoveMC.exe

Geräte-Ausgabebereich Voreinstellungen Y X -Z Sichtbereich im WC glFrustum / gluPerspective Geräte-Ausgabebereich Window glViewport

Sichtbarer Bereich Sichtbereich im WC glFrustum / gluPerspective Oder: Y X -Z Sichtbereich im WC glFrustum / gluPerspective glMatrixMode ( GL_PROJECTION); glFrustum ( links, rechts, unten, oben, zStart, zEnde ); Oder: glMatrixMode ( GL_PROJECTION); gluPerspective ( öffnungWinkel, y_zu_x_Aspect, zStart, zEnde );

Geräte-Ausgabebereich Y X -Z glViewport glViewport ( 0,0, windowWidth, windowHeight); Window

Trafo-Pipeline 2 3 1 4 Window Y Eye Coordinates (WC) Modelview Trafo X -Z Eye Coordinates (WC) Modelview Trafo Projection Trafo 2 3 MC 1 1 Object Coordinates (MC) Clip Coordinates (Fläche) Window 4 Viewport Trafo Windows Coordinates

Wo sind die Trafo-Infos? Modelview Trafo Modelview Matrix Projection Trafo Projection Matrix Viewport Trafo x,y, width, height Matrix: mathematische Datenstruktur, die alle Tranformationenseinstellungen speichert

Zugriff auf Einstellungen Modelview Trafo glMatrixMode (GL_MODELVIEW) glLoadIdentity, glTranslated, glRotated, glScaled,... Projection Trafo glMatrixMode (GL_PROJECTION) glLoadIdentity, glFrustum,... Viewport Trafo glViewport Abfrage über glGet GL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX, GL_VIEWPORT Zwischenspeichern glPushMatrix(), glPopMatrix() OpenGL als State Machine Aktuellen Einstellung zählen --> glLoadItentity wirkt im aktuellen Matrixmode

Demo: SDK_Minimal Create Size Paint Destroy 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ören Create Size Paint Destroy

Demo: NET_Minimal Load SizeChanged Paint Render Context erzeugen Sichtbarkeitsbereich und Fensterbereich einstellen ClearBuffer() MC-Trafos Objekte ausgeben SwapBuffer() Load SizeChanged Paint

Demo: NET_Bewegt Bewegtes Bild Timer WinForm Timer_Tick globale Paramter ändern Invalidate() Form_Load myForm.SetStyle( ControlStyles.Opaque, true ); Fensterbereich nicht löschen („Zappelei“), sondern nur OpenGL Buffer einblenden WinForm

Eigene Objekte OpenGL bisher: “aux”-Objekte Punkt Linie Polygon (Dreieck, Viereck) OpenGL 3D Objekt Oberflächen- elemente

Fläche übergeben -1,1,1 1,1,1 -1,-1,1 1,-1,1 OpenGL Pipeline Linksumlauf 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 (); OpenGL Pipeline

Fläche & Normale Normalvektor * senkrecht von Oberfläche weg * z.B. für Lichtabstrahlung wichtig -1,-1,1 1,-1,1 1,1,1 -1,1,1 Linksumlauf glBegin (GL_POLYGON); //Würfel vorne 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 ();

Demo: Wuerfel Würfel ohne Licht und Material

Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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 Licht bis 8 Lichtquellen glEnable ( GL_LIGHTING ) ambientes Licht bis 8 Lichtquellen glEnable ( GL_LIGHT0 )... Material-Eigenschaften Farbe im Color Buffer

Licht-Arten ambientes Licht diffuses Licht Spekulares Licht keine Einfallsrichtung (im Raum verteilt) keine Abstrahlrichtung Einfallsrichtung (--> Schräge der Fläche) Ausfallsrichtung (--> Lage zum Betrachter) Unabhängige Materialfarbe ambientes Licht diffuses Licht Spekulares Licht “Emittiertes Licht”

Ambientes Licht (global) glLightModelfv (GL_LIGHT_MODEL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } ); Interne Berechnung Beispiel: 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 );

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);

Demo: LichtMaterial (1) Sample 1..15 Lichtquellen und Materialeigenschaften.

Nahe Lichtquelle als “Taschenlampe” Spotlight Nahe Lichtquelle als “Taschenlampe” 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 Exponent =0 --> immer Faktor 1 sonst: je senkrechter Licht, desto stärker

entfernt weniger Licht 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 ); Alles wirkt zusammen konstant unabhängig von Entfernung schwächeres Licht linear mit Entfernung gleichmäßige Lichtabnahme quadratisch mit Entfernung raschere Lichtabnahme

Nebel Näher --> Materialfarbe Ferner --> Nebelfarbe 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 );

Transparentes Material RGBA A = Alpha-Wert Alpha 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

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

Back Face Culling Back 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

Demo: LichtMaterial (2) Sample 17.. Alpha-Blending, Back Face Culling

Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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…) glRasterPos Ausgabeposition im MC Darstellung Parameter: Adresse der Pixel,... glBitmap

Images Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B Keine Trafo (Drehen…) glRasterPos Ausgabeposition im MC Darstellung Parameter: Adresse der Pixel,... glDrawPixels Win32 BMPs: Blue-Green-Red-Reihenfolge!

glEnable ( GL_TEXTURE_2D ) 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…) glEnable ( GL_TEXTURE_2D ) Texturen verwendbar glTexImage2D Pixelarray übergeben Win32 BMPs: Blue-Green-Red-Reihenfolge!

Textur auf Fläche t 1 1 s Rahmen: Ziel-Fläche eines 3D-Objekts glBegin (GL_POLYGON); //Fläche glNormal3d (0,0,1); glTexCoord2d ( 0.6, 0.5); glVertex3d (1,1,0); //r o glTexCoord2d ( 0.2, 0.5); glVertex3d (-1,1,0); //l o glTexCoord2d ( 0.2, 0.1); glVertex3d (-1,-1,0); //l u glTexCoord2d ( 0.6, 0.1); glVertex3d (1,-1,0); //r u glEnd (); t 1 0.5 0.1 0.2 0.6 1 s Rahmen: Ziel-Fläche eines 3D-Objekts

Demo: BmpNFonts (1) BmpNFonts Bitmap Image Texture (Font kommt später)

Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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 () glCallList (inx) glListBase ( inxOffset ) glCallLists ( nCount, GL_INT, inxArr ) glDeleteLists (inxFirst, nCount)

True Type Fonts wglUseFontOutlines Erzeugt Display List für jeden Glyphen (Zeichendarstellung) glCallLists Anzeige eines String. String als Indexarray für die Display Lists der Glyphen

Demo: BmpNFonts (2) BmpNFonts Font

Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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 erlaubt Nein ! Einkerbung Nein ! Ausstanzung 1 2 Rechts-Umlaufsinn Nein ! 3 4

Einfache Elemente Flächen direkt programmierbar Würfel Pyramide …

Berechnete Objekte Flächenelemente berechnen Kugel Rohr … oft Punktegitter erzeugen Die benachbarten Punkte umschließen eine Fläche (vgl. auxWireSphere...)

Zusammensetzung aus elementaren Teilobjekten Kombi-Objekte Zusammensetzung aus elementaren Teilobjekten

Objekte scannen Prinzip: Thomograf Punktegitter Textur Farben Echoabstastung für Koordinaten + Kamera für Texturelemente Lichtreflexion messen für Material,Normalen Punktegitter Textur Farben

Demo: Objects Objects KombiObjects RobotMSJ RobotMSJ stammt vom MSDN.

Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D 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 Schlußbemerkung OpenGL Direct3D 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 Internet via 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, siehe http://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...