Erste Schritte in OpenGL

Ähnliche Dokumente
2.10 Lichtquellen und Beleuchtung

Lichtquellen und Beleuchtung

2.10 Lichtquellen und Beleuchtung

Einführung in die API OpenGL

Grafikprogrammierung (Echtzeitrendering)

Graphische Datenverarbeitung I WS 2017/2018. OpenGL Einführung. Prof. Dr. techn. Dieter Fellner. Roman Getto. Julian Zobel

Übung: Computergrafik 1

3D Programmierpraktikum: Geometrische Transformationen, Materialien und Beleuchtung

Grafikprogrammierung mit OpenGL

Einführung in OpenGL. Thomas Kalbe Technische Universität Darmstadt.

Einführung in OpenGL. Einführung in OpenGL

Schattierung und Beleuchtung

OpenGL Transformationen: Modeling

Tim Pommerening v0.0.1 (ohne Gewähr) Seite 1 von 6

OpenGL for Java OpenGL for Java Prof. Dr. V. Stahl

Beleuchtung. Matthias Nieuwenhuisen

1: Diese Ausarbeitung enthält in Papierform:

Proseminar Computergrafik: OpenGL

Workshop: Einführung in die 3D-Computergrafik. Julia Tolksdorf Thies Pfeiffer Christian Fröhlich Nikita Mattar

CGVert. Projekt. 3D-Scannen. Multimarker Tracking. Triangulierung. Low-Cost Scanner P 4. Ball-Erkennung. 3D Positionsbestimmung. Kalmanfilter. CGVert.

OpenGL 2.0 Vertex Arrays

3D Programmierpraktikum: Szenegraphen und Texturierung

Das ausführbare Programm Bsp1.cfg, Bsp1.dof, Bsp1.dpr, Bsp1.res Projektdateien für Delphi 7 Prak.pas

Eine Einführung in OpenGL

Grundlagen der 3D-Computergrafik Programmieren mit OpenGL

3.1 Motivation. - Mit (mehreren) Koordinatentransformationen wird das Objektsystem in das Gerätesystem transformiert.

CGR I Beleuchtung und Schattierung

Computergraphik Grundlagen

OpenGL. Kapitel Grundlagen

Wo stehen wir? Geometrie Transformationen Viewing Beleuchtungsmodelle

MaTHEMATISCHE GRUNDLAGEN BUGA-AR TELESCOPE. Marko HeRBERTZ

1.1 Verwendung von GLUT

OpenGL als API für Augmented und Virtual Reality

7.1 Polygon Offset. Anwendung - Darstellung von Polygonen als Teil von Oberflächen - Beispiel: Gradlinien auf der Erde - Schwierigkeit:

Planare Projektionen und Betrachtungstransformation. Quelle: Angel (2000)

Computer Graphics Shader

Einführung OpenGL und GLUT WPF Spiele, Simulation und dynamische Systeme

Computergrafik 1 Übung, Wintersemester Eclipse Hands-On. C++ Projektsetup mit OpenGL und GLUT unter Eclipse für Windows

Technische Universität Dresden Fakultät Informatik Prof. Dr.-Ing.habil. Orlamünder. OpenGL. OpenGL. OpenGL000

Softwareprojekt Spieleentwicklung

2D-Transformationen. Kapitel Translation. 6.2 Skalierung

Grafikprogrammierung mit OpenGL

Praktikum: Spieleengine im Eigenbau

OpenGL auf Mac OS X und ios

Computer Graphik (CS231) Projektübungsblatt 3

Proseminar: Virtuelle Präsenz. Vortrag: Steve Rechtenbach

Grundlagen der 3D-Grafik

Programmierpraktikum 3D Computer Grafik

DirectX und OpenGL. Proseminar Multimedia-Hardwareerweiterungen Michel Weimerskirch, 15. Februar 2006

Computergrafik II. OpenGL Einführung

Grafikprogrammierung mit OpenGL I

Computergrafik 1 Beleuchtung

Probelektion zum Thema. Shadow Rendering. Shadow Maps Shadow Filtering

1. Übung zu "Numerik partieller Differentialgleichungen"

Programmierpraktikum 3D Computer Grafik

Einführung in GLSL - OpenGL Shading Language. Athanasios Karamalis

(1) 3D Engines. Vorlesung Computergraphik 2 D. Grüntjens Folien: Stefan Rilling / D. Grüntjens KOBLENZ LANDAU

Lösungsvorschlag zum zweiten Übungsblatt

Java 3D. Linien, Flächen und Objekte Axel Bartsch, Okt. 2002

UIKit (Cocoa Touch) Framework für ios Apps. Objective C. Model View Controller Pattern

-dimensionale Darstellungen

OpenGL. Rendering: (Wiedergabe, Darstellung): Erzeugg. digitaler (Pixel-)Bilder aus log.-mathem. Modell-Beschreibungen.

Grundlagen der Spieleprogrammierung

(12) Wiederholung. Vorlesung Computergrafik T. Grosch

Computergrafik Sommersemester 2004 Übungen

Integration von 3D-Visualisierungstechniken in 2D-Grafiksystemen

EVC Repetitorium Blender

Computergraphik I Die Graphik-Pipeline &

Entwicklung eines JOGL-basierten Frameworks zur Darstellung von Game Physics

Spiele, Simulation, dynamische Systeme

Praktikum Computergrafik

Computergrafik 1 Transformationen

Zwischenvortrag zum Entwicklungsstand der Bachelor-Arbeit. Direct 3D-Output für ein Rendering Framework

Einfache Liste: Ein Stapel (Stack) Ansatz. Schaubild. Vorlesung 1. Handout S. 2. Die einfachste Form einer Liste ist ein Stapel (stack).

GL ShadingLanguage(GLSL)

Kapitel 2: Mathematische Grundlagen

Display-Listen, Blending, Antialiasing, Nebel. Display-Listen

3D Programmierpraktikum: Schattenberechnung in Echtzeit

Praktische Informatik 1

1 OpenGL in Delphi. 1.1 Vom Pixel zur Simulation. kleiner kommunikation

Kapitel 4: Schattenberechnung

OpenGL und die Fixed-Function-Pipeline

Objektorientierte Programmierung

4 Grundlagen zu SVG-Karten und -Diagrammen...33

Transformationen im 3D-Raum

Transkript:

Erste Schritte in OpenGL

Modelierung Aus Punkten werden geometrische Körper Komplexe Objeckte werden aus meheren einfachen Objeckten erstellt Dazu müssen Vertexes (Punkte) im virtuellen Raum angefordnet werden

3D Transformation Drei der wichtigsten Koordinatentransformationen y y y x x x Translation Skalierung Rotation

3D Translation & Rotation in kartesischen Koordinaten t p M p x 3 3 ' z y x p 3D Punkt Translation z y x t t t p p ' Rotation um die Z-Achse Aufeinanderfolgende Transformationen erfordern die Kombination von Matrixmultiplikation & Vektoraddition p p 1 cos sin sin cos '

Homogenen Koordinaten 1 1 1 1 1 T I t t t z y x Translationsmatrix Translation p T I p 1 ' Homogene Koordinaten ermöglichen es auch die Translation als Matrixmulitplikation anzuwenden. Der Raum wird dazu um eine Dimension erweitert. Translation kann ebenfalls als Matrix dargestellt werden. 1 z y x z y x

Homogene Koordinaten p R p 1 p M p x 4 4 ' 1 1 R R Rotationsmatrix Rotation Aus wird t p M p x 3 3 ' Somit lassen sich alle Transformationen im Raum durch Matrizen beschreiben.

Beispiel 3D Euklidische Transformation 1 1 1 z y x T R z y x Zuerst Rotation um die Z-Achse dann Translation (Matrixmultiplikation von rechts nach links)

3D Skalierung 1 * 1 1 z y x s s s z y x z y x

Euler-Winkel für die Rotation R=R z R y R x Rotation um die z-achse: Rotation um die y-achse: Rotation um die x-achse:

OpenGL (Graphics Library ) seit 1992 API Spezifikation für Plattform-, Programmiersprachen-, Hardwareunabhängigen Zugriff auf (beschleunigte) Graphikhardware Entwickelt von Silicon Graphics Dessen Implementierung wird i.a. mit dem Graphikkartentreiber mitgeliefert. Zustandsbasiertes Modell Wozu: Visualisierung, Computergraphik, Spielentwicklung, Aktuelle Version 3. (August 28) Erweiterbar mit Hardwarehersteller spezifischen Extensions die über Extensionfunktionen nutzbar sind (siehe GLEW OpenGL Extension Wrangler Library) Websites http://opengl.org, http://glew.sourceforge.net/

OpenGL API Function Naming Convection <Library prefix><main command><optional argument count> <Optional argument type> Example: glcolor3f gl : Prefix OpenGL function Color: Main Command 3 : number of arguments f : type of arguments (here float) glcolor4f, glcolor3i, glvertex3f,...

Rendering Pipline für 3D

Objekt/Welt Koordinaten Sytem und Kamera y z x World Coordinate Sytem Kameraposition mit glulookat(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz) Default-Kamera: Position auf (,,) Sicht-Vector (,,-1), Up-Vector (,1,)

Rendering Pipline für 3D y z x

Modelieren Modell generieren glbegin() glend() oder glut[object], glu[object], eigene Modelle/Renderobjects Modell befindet sich im Welt-Koordinaten Raum

Rendering Pipline für 3D

3D Transformationen in OpenGL Translation gltranslatef(7.f,.f,.f); Rotation glrotatef(35.f,.f,.f,1.f); Skalierung glscalef(.5f,.5f,.5f); Transformation in homogenen Koordinaten glmultmatrixf(pointertomatrix); Nicht vergessen: In OpenGL werden die neuen Matrizen von rechts multipliziert In OpenGL sind Matrizen im Speicher spaltenweise ablegt: // 7 Einheiten nach rechts verschieben // (in positiver x-richtung) // 35 Grad um die z-achse rotieren // (Gegen den Uhrzeigersinn) // in x-, y- und z-richtung // um Faktor.5 skalieren // Multipliziert die aktuelle 4x4 // Matrix mit der 4x4 Matrix, auf die // von pointertomatrix gezeigt wird

Rendering Pipline für 3D

Projektion Projektionsparameter setzen glmatrixmode(gl_projection); glloadidentity(); gluperspective(45.,1.,1., 1.); oder glfrustum( ); glortho(),

Rendering Pipline für 3D

Viewport Bildauschnitt setzen glviewport(,,width,height);

Grundobjekte Primitive zeichnen: glbegin(gl_polygon); glvertex2f(.,.); glvertex2f(., 3.); glvertex2f(4., 3.); glvertex2f(6., 1.5); glvertex2f(4.,.); glend(); GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP, GL_POLYGON

Grundobjekte Außer mit glbegin( ) und glend() können mit GLUT einfach einige Grundobjekte gezeichnet werden http://www.opengl.org/resources/libraries/glut/ glutsolidsphere(gldouble radius, GLint slices, GLint stacks), glutsolidcube(gldouble size), glutsolidcone(gldouble base, GLdouble height, GLint slices, GLint stacks), glutsolidteapot(gldouble size) Alle GLUT Objekte können auch als Drahtmodell gezeichnet werden z.b. glutwireteapot(gldouble size)

OpenGL ist ein Zustandsautomat D.h. wenn man Sachen ändert, bleiben sie solange bestehen, bis man sie wieder ändert. Man kann einen Zustand in den Keller [Stack] retten, um ihn später wiederherzustellen glpushattrib(gl_eigenschaft) rettet den Wert von GL_EIGENSCHAFT in den Keller [Stack] glpopattrib(gl_eigenschaft) stellt den Wert wieder her glpushattrib(gl_all_attrib_bits ) rettet alle Attribute / Eigenschaften z.b. glcolor3f(1.,.,.), Color is set to red and stays until new call to glcolor() Das gleiche gilt auch für die Matrizen glpushmatrix() rettet die aktuelle Matrix glpopmatrix() stellt die gerettete Matrix wieder her

Matrix Mode :: MODELVIEW_MATRIX glloadidentity(); setzt die Modelview-Matrix auf die Identität glloadmatrix*(pointertomatrix); setzt den Wert der Modelview-Matrix auf die pointertomatrix glmultmatrix*(pointertomatrix); multipliziert den Wert der Modelview-Matrix mit pointertomatrix GLdouble model[16]; glgetdoublev(gl_modelview_matrix,model); liest den Inhalt der Modelview-Matrix in die Variable model * ist ein Platzhalter fuer den Datentyp. Exemplarische Werte sind (i) 32-bit integer, (f) 32-bit floating-point or (d) 64-bit floating-point double

Adventskranz neben Teekessel void adventskranz(){ glpushmatrix(); glutsolidtorus(6, 1, 1, 1); gltranslatef(-5.,,5.); // Verschiebung nach vorn rechts glutsolidcone(5., 8., 1, 1);//Breite 5, Höhe 8 gltranslatef(1.,.,.); // Verschiebung nach rechts glutsolidcone(5., 8., 1, 1);//Breite 5, Höhe 8 gltranslatef(.,.,-1.); // Verschiebung von Kamera weg glutsolidcone(5., 8., 1, 1);//Breite 5, Höhe 8 gltranslatef(-1.,.,.); // Verschiebung nach links glutsolidcone(5., 8., 1, 1);//Breite 5, Höhe 8 glpopmatrix(); } glpushmatrix(); adventskranz(); glpopmatrix(); gltranslate(-2.,.,.); glutsolidteapot(1.);

Tiefenpuffer Neben dem Framebuffer (Bild Puffer) für Farbwerte für jedes Pixel auch Puffer für Tiefenwert. Wird dieser aktiviert, wird ein Pixel nur neu gezeichnet, wenn der Pixel näher zur Kamera ist! glcolor3d(.,.,1.); // Blau glutsolidteapot(1.); gltranslate(.,.,2.); // 2 nach hinten glcolor3d(1.,.,.); // Rot glutsolidteapot(1.); Ohne Tiefenpuffer werden die Objekte einfach übereinander gelegt. glenable(gl_depth_test); gldepthfunc(testtype); TestType: GL_LESS (ist standardgemäß voreingestellt), GL_NEVER, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS.

Es werde Licht

Verschieden Arten von Licht Ambient Light Setzt die Grundhelligkeit einer Szene fest ambient Diffuse Light gerichtetes Licht Quelle im unendlichen Vergleich: Oberflächennormale - Lichtrichtung Specular Light diffuse Gerichtetes Licht mir speziellen Reflexionseigenschaften Vergleich: Oberflächennormale-Lichtrichtung-Kameraposition Emitted Light Wird vom Polygon selber ausgestrahlt emited

Licht in OpenGL GLfloat light_ambient[] = {.,.,., 1. }; GLfloat light_diffuse[] = { 1., 1., 1., 1. }; GLfloat light_specular[] = { 1., 1., 1., 1. }; GLfloat light_position[] = { 1., 1., 1.,. }; gllightfv(gl_light, GL_AMBIENT, light_ambient); gllightfv(gl_light, GL_DIFFUSE, light_diffuse); gllightfv(gl_light, GL_SPECULAR, light_specular); gllightfv(gl_light, GL_POSITION, light_position); glenable(gl_lighting); glenable(gl_light); Maximale Anzahl der Lichtquellen: int maynumlights = ; glgetintegerv(gl_max_lights, &maynumlights); Zuviele Lichtquellen geht zu lasten der Performance!

Licht in OpenGL GLfloat light_position[] = { 1., 1., 1., w }; gllightfv(gl_light, GL_POSITION, light_position); Unterscheide zwischen gerichtetem Licht und w= Positionslichtquelle w!= gllightf(gl_light, GL_SPOT_EXPONENT, 15.f); gllightf(gl_light, GL_CONSTANT_ATTENUATION, 1.f); gllightf(gl_light, GL_LINEAR_ATTENUATION,.f); gllightf(gl_light, GL_QUADRATIC_ATTENUATION,.f); gllightfv(gl_light, GL_SPOT_DIRECTION, direction); gllightf(gl_light, GL_SPOT_CUTOFF, spotcutoff);

Materialeigenschaften für die Objekte Für die Reflektionseigenschaften gibt es zwei Möglichkeiten schnell&einfach: glcolormaterial(gl_front_and_back, GL_AMBIENT_AND_DIFFUSE); glenable(gl_color_material); langsamer &differenzierter: glmaterialf(gl_front_and_back, GL_SHININESS, 4); glmaterialfv(gl_front_and_back, GL_AMBIENT_AND_DIFFUSE, vector_ambi_diff); glmaterialfv(gl_front_and_back, GL_SPECULAR, vector_spec);

Displaylisten Statische Objekte, die sich zwischen glbegin() und glend() beim erneuten Aufruf nicht ändern, kann man auf der Graphikkarte zwischenspeichern Weniger Belastung für den Bus Schnellere Ausführung Besonders lohnenswert bei großen Objekten

Vorgehensweise Leere Liste erzeugen GLuint model; model = glgenlists(2); // Erzegt zwei Listen und übergibt // deren Namen an model Liste befüllen glnewlist(model, GL_COMPILE); // glbegin und glend() u.s.w. glendlist(); Liste anzeigen glcalllist( model ); Zweite Liste benutzen glnewlist(model+1, GL_COMPILE);... glcalllist( model+1 ); Überprüfen, ob es die Liste n gibt GLboolean glislist( model + n );

OpenGL Ist kein GUI Toolkit OpenGL bieten keinen Funktionalität an zu generieren und managen von GUI Fenstern Der Setup eines validen OpenGL Render Kontexts wird dem Programmierer überlassen Fenster und OpenGL Render Kontext können mit verschiedenen GUI Toolkits erstellt werden, z.b. GLUT, Qt, FLTK, MFC,... GLUT OpenGL Utility Library: Eine platformunabhängige Bibliothek zum generieren und manages eine simplen Fensters mit OpenGL Kontext. Events wie Maus und Tastatur können auch gehandhabt werden. Websites http://www.opengl.org/resources/libraries/glut/, http://openglut.sourceforge.net/, http://www.xmission.com/~nate/glut.html

Fenstermanagement mit GLUT oder Qt GLWidget mit Qt ODER GLUT Bibliothek einbinden (glut.h, glut32.lib aus dem GLUT Verzeichnis) ermöglicht, ein Fenster mit GL Kontext unter verschiedenen Betriebssystemen zu erzeugen ermöglicht, Tastatur, Maus und Keyboardeingaben zu behandeln Download und Infos: http://www.opengl.org/resources/libraries/glut/

Setup einer OpenGL App mit GLUT Downloaded des GLUT source-code order der vorkompilierten platform spezifischen Bibliotheken (für Anfänger empfohlen) Inkludieren der header files glut.h und glu.h Hinzufügen der GLUT und GLU library als linker inputs (glut32.lib, glu32.lib) Häufistiger Fehler beim Setup von GLUT GLU: Paths zu header und lib Datein wurden in den MS Projekt Einstellungen nicht hinzugefügt Download http://www.opengl.org/resources/libraries/glut/, http://openglut.sourceforge.net/, http://www.xmission.com/~nate/glut.html

GLUT App Min. requirements

GLUT App Min. requirements

GLUT App Min. requirements

GLUT App Min. requirements

GLUT App Min. requirements

Hilfe?! Delphi Wiki (http://www.delphigl.com/), ist zwar nicht C++, sondern Delphi, aber OpenGL ist sprachunabhängig! NeHe Online Tutorials samt Code (http://nehe.gamedev.net/) oder dessen deutsche Übersetzung (http://www.joachimrohde.com/cms/xoops/modules/articles/index.php?ca t_id=1) Originalreferenz von SGI (http://www.opengl.org/) Das RedBook Version 1.1 online (http://www.opengl.org/documentation/red_book/) GLUT Spezifikation (http://www.opengl.org/resources/libraries/glut/spec3/spec3.html) OpenGL Interactive Tutorials (http://www.xmission.com/~nate/tutors.html)