Computergraphik I Die Graphik-Pipeline &

Ähnliche Dokumente
Seminar Game Development Game Computer Graphics. Einleitung

Softwareprojekt Spieleentwicklung

Was ist QT? Beispiele: KDE Google Earth Mathematika

Einführung in OpenGL. Einführung in OpenGL

Probelektion zum Thema. Shadow Rendering. Shadow Maps Shadow Filtering

Grundlagen der 3D-Grafik

OpenGL auf Mac OS X und ios

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

Praktikum Computergrafik

Computer-Graphik I Transformationen & Viewing

Kapitel 4: Schattenberechnung

GL ShadingLanguage(GLSL)

Computergrafik II. OpenGL Einführung

Einführung in die Programmierung

Einführung in die Programmierung Wintersemester 2011/12

Eine Einführung Computergrafik SS14 Timo Bourdon

OpenGL. (Open Graphic Library)

Geometrische Primitive und Hidden Surface Removal

Proseminar: Virtuelle Präsenz. Vortrag: Steve Rechtenbach

Objektorientierte Programmierung mit C++ (WS 2010)

Interaktive Simulationen Lektion 1/3: Event-Driven Design und Signals

Qt Programmierung Teil 1 Fenster erstellen by NBBN ( CrashKurs-Artig. Was brauche ich? -Einige C++ Kenntnisse

Diplomarbeit. Neue Möglichkeiten durch programmierbare Shader. Unter der Leitung von: Prof. Dr.-Ing. Detlef Krömker

Praktikum: Spieleengine im Eigenbau

Grafikprogrammierung (Echtzeitrendering)

Übung: Computergrafik 1

Grundlagen der Spieleprogrammierung

Computer-Graphik I. Shader-Programmierung. G. Zachmann University of Bremen, Germany cgvr.informatik.uni-bremen.de

Einführung. GPU-Versuch. Andreas Schäfer Friedrich-Alexander-Universität Erlangen-Nürnberg

(10) Deferred Shading

GUI Programmierung mit Qt

Computergraphik I. Scan Conversion: Lines & Co. Einordnung in die Pipeline. G. Zachmann Clausthal University, Germany zach@tu-clausthal.

Computergrafik. Michael Bender, Manfred Brill. Ein anwendungsorientiertes Lehrbuch ISBN Inhaltsverzeichnis

(7) Normal Mapping. Vorlesung Computergraphik II S. Müller. Dank an Stefan Rilling U N I V E R S I T Ä T KOBLENZ LANDAU

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

Texture Based Direct Volume Rendering

Fortgeschrittene Kapitel: Grafische Ausgabe mit C++ Karl Gmeiner

Computergrafik Universität Osnabrück, Henning Wenke,

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

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

General Purpose Computation on GPUs

(9) Modernes OpenGL. Vorlesung Computergraphik III S. Müller U N I V E R S I T Ä T KOBLENZ LANDAU

PeakTech Zeitprogramm erstellen über Excel - Beispiel / Timed programs with Excel Example

Grundlagen der Spieleprogrammierung

BlendaX Grundlagen der Computergrafik

Die Welt der Shader. Fortgeschrittene Techniken III

Lichtquellen und Beleuchtung

Ansätze 4. GPU. Echtzeit- Raytracing. Polygon- Rendering. Computerspiele Sommer (c) 2013, Peter Sturm, Universität Trier 1

Workshop: Entwickeln mit Qt 4. Daniel Molkentin

Introduction to Python. Introduction. First Steps in Python. pseudo random numbers. May 2016

Praxisorientierte Einführung in C++ Lektion: "Einführung in das GUI-Toolkit Qt"

Plan für heute. Vorlesungstermine. CG1 & CG2 Vorlesungsthemen. Anwendungsgebiete. Warum Computer Grafik? Computergrafik 1&2 SS 2010

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

Integration von 3D-Visualisierungstechniken in 2D-Grafiksystemen

Grundkurs C++ Buildsysteme Versionsverwaltung mit git

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++ Buildsysteme

Grundkurs C++ Buildsysteme Versionsverwaltung mit git

Workshop: Entwickeln mit Qt 4. Daniel Molkentin

Computergraphik Grundlagen

Rendering Grundlagen Autodesk Maya. Grundlagen. Version Ingo Clemens brave rabbit

Einführung in die Programmierung mit Qt

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

Asteroids3D Seminar: Game Programming. Anita Dieckhoff, Pedro Flemming, Jan Ole Vollmer Betreuung: Christine Lehmann

Beleuchtung Schattierung Rasterung

RST-Labor WS06/07 GPGPU. General Purpose Computation On Graphics Processing Units. (Grafikkarten-Programmierung) Von: Marc Blunck

OpenCL. Programmiersprachen im Multicore-Zeitalter. Tim Wiersdörfer

Jörn Loviscach Hochschule Bremen

OpenGL ES 2.0. OpenGL ist eine Bibliothek zur Ansteuerung von Grafikhardware

Computer Graphik. Mitschrift von

Einführung in Visual Computing

Von Keerthikan T. & Siyar Kolusari

Praxisorientierte Einführung in C++ Lektion: Einführung in das GUI-Toolkit Qt

Beleuchtung. in Computerspielen

(5) GPU Einführung. Vorlesung Computergraphik II Stefan Müller. Dank an Markus Geimer, Thorsten Grosch und Niklas Henrich KOBLENZ LANDAU

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Exercise 6. Compound Types and Control Flow. Informatik I für D-MAVT. M. Gross, ETH Zürich, 2017

Vererbung & Schnittstellen in C#

Jens Konerow. Managed DirectX und C#

3D Programmierpraktikum: Szenegraphen und Texturierung

Tipps & Tricks. Eine Standardfunktionalität ist das Erstellen von Grafischen Basisobjekten auf dem Patran Viewport.

Softwareschnittstellen

Tube Analyzer LogViewer 2.3

Einführung in Visual Computing

Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10. computer graphics & visualization

Einführung in Truevision3D

Grafikkarten-Architektur

Praktikum IKT 3. Semester

Computer Graphik (CS231) - Installation der Software

Transkript:

Computergraphik I Die Graphik-Pipeline & Einführung in OpenGL 3+ G. Zachmann University of Bremen, Germany cgvr.informatik.uni-bremen.de

OpenGL OpenGL ist ein Software-Interface für Graphik-Hardware mit ca. 250 verschiedenen Kommandos Hardware-unabhängig, Hersteller-unabhängig Warum Open? Weiterentwicklung durch die Khronos-Gruppe - NVIDIA, ATI, IBM, Intel, SGI,. Von jedem Lizenznehmer erweiterbar (mittels Extensions) Nicht dabei (ein Feature): Handhabung von Fenstern/Windows, Benutzereingabe Der Standard im embedded Bereich (OpenGL ES) Smartphones, car infotainment, aircraft cockpits,... Viele weitere offene Standards der Khronos-Group ergänzen OpenGL Graphik-Pipeline 4

Geschichte vor OpenGL Standardisierungsbemühungen vor OpenGL GKS, PHIGS, Proprietäre Systeme HP: Starbase SGI: GL (Graphics Library) Gewinner: SGI mit GL in Verbindung mit sehr guter Hardware OpenGL (1992, Mark Segal & Kurt Akeley) Konkurrenz nur noch durch Microsoft (Direct3D) Graphik-Pipeline 5

Khronos Open Standards for Graphics and Compute Khronos 2016 G. Zachmann Computergraphik 1 WS 14 November 2017 Graphik-Pipeline 6

Die Grundstruktur von OpenGL-Programmen 3 Arten von Funktionen Zustand ändern Daten (z.b. Vertex-Koordinaten) übergeben Geometrie darstellen Klarer Namensraum Befehle fangen mit gl... an Konstanten mit GL_... Darauf aufbauend gibt es diverse Tools: Glm: Mathematische Funktionen (Vektoren, Matrizen,...) glew/glfw/...: Libraries zur Benutzerinteraktion, Fenstermanagement Qt: beinhaltet Kombination und noch viel mehr Graphik-Pipeline 7

"A Trip Down the Graphics Pipeline" Input: Geometric model: description of all objects, surfaces, Transformations Lighting model: Computational description of object and light properties, interaction (e.g., reflection) Synthetic Viewpoint (or Camera): Eye position and viewing frustum Raster Viewport (Frame Buffer): Pixel grid onto which image plane is mapped Output: Colors / Intensities suitable for framebuffer display (for example, 24 Bits RGB values at each pixel) Model-to-World Transformation Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projection (in Screen Space) Scan Conversion (Rasterization) Visibility / Display Graphik-Pipeline 8

Model Transformation (Model-to-World) 3D Modell wird im eigenen Koordinatensystem definiert (object space) Model Transformation positioniert die Objekte in einem allg. Koordinatensystem (world space) Model Transformation Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping y Projection (in Screen Space) Object spaces z World space x Scan Conversion (Rasterization) Visibility / Display Graphik-Pipeline 9

Illumination (Beleuchtung, Schattierung) Beleuchten von Polygonen (für Schattierung und Highlights) gemäß der Material-Eigenschaften, Oberflächeneigenschaften und Lichtquellen Lokale Beleuchtungsmodelle (kein Lichttransport von einem Obj zum anderen) Model Transformation Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projektion (in Screen Space) Scan Conversion (Rasterization) Visibility / Display Graphik-Pipeline 10

Viewing Transformation Umwandeln von Welt-Koord. nach Kamera-Koord. Bestimme Transformation für komplette Szene so, daß Betrachter-Position in den Ursprung verschoben wird und Blickrichtung entlang (-Z)-Achse ist y eye space Model Transformation Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projection (in Screen Space) z world space x Scan Conversion (Rasterization) Visibility / Display Graphik-Pipeline 11

Clipping Abschneiden der Polygone, die außerhalb des sichtbaren Bereiches liegen (view frustum) Dazu: transformiere Szene in normalisierte Koordinaten (NDC) Modell Transformation Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projektion (in Screen Space) Scan Conversion (Rasterization) eye space NDC Visibility / Display Graphik-Pipeline 12

Projektion Das Objekt wird nach 2D projiziert und räumlich diskretisiert (screen space) Modell Transformation NDC Screen Space Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projection (in Screen Space) Scan Conversion (Rasterization) Visibility / Display Graphik-Pipeline 13

Scan Conversion (Rasterisierung) Rasterisierung der Polygone in Pixel Ecken-Werte interpolieren (Farbe, Tiefenwert, ) Modell Transformation Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projektion (in Screen Space) Scan Conversion (Rasterization) Visibility / Display Graphik-Pipeline 14

Visibility (Sichtbarkeit) u.a. Tests Verdeckungen bestimmen Evtl. weitere Pixel-Operationen: Blending mit vorhandenem Frame-Buffer- Inhalt Maskierung (z.b. wegen Verdeckung durch andere Fenster) Farb-Transfer Modell Transformation Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projektion (in Screen Space) Scan Conversion (Rasterization) Visibility / Display Graphik-Pipeline 15

Definition Vertex Vertex = "Eckpunkt" = alle Attribute zur vollständigen Spezifikation eines Eckpunktes eines Primitives 3D Koordinaten (zunächst in Modelling Coords!) Farbe (evtl.) Normale (meistens) Textur-Koordinaten (u,v) user-defined attributes (soviele man möchte) Graphik-Pipeline 16

Definition Fragment und Pixel Achtung: unterscheide zwischen Pixel und Fragment! Pixel := eine Anzahl Bytes im Framebuffer bzw. ein Punkt auf dem Bildschirm Fragment := eine Menge von Daten (Farbe, Koordinaten, Alpha, ), die zum Einfärben eines Pixels benötigt werden M.a.W.: Ein Pixel befindet sich am Ende der Pipeline (im Framebuffer) Ein Fragment ist ein "Struct", das durch die Pipeline "wandert" und am Ende in ein Pixel gespeichert wird Graphik-Pipeline 17

Die GPU als "State-Machine" Man versetzt die "Maschine" in einen Zustand, der so lange besteht, bis er wieder verändert wird Beispiel: kopiere Daten in eine Vertex-Liste Effizienter, als Daten jedes Mal neu zu übergeben Zeichenkommandos State Changes GPU Graphik-Pipeline Zustand: Aktuelle Transf. Aktueller Vertex Buffer Aktuelle Textur Fragmente Graphik-Pipeline 18

Beispiel zur Betrachtung des Datenflußes Old mode (fixed-function, immediate): glclearcolor(1, 1, 1, 1); glclear(gl_color_buffer_bit); glloadidentity(); glortho(0, 100, 0, 100, -1, 1); glbegin(gl_polygon); glcolor3f(0, 0.5, 0); glvertex2f(11.0, 31.0); glvertex2f(37.0, 71.0); glcolor3f(0.5, 0, 0); glvertex2f(65.0, 71.0); glvertex2f(91.0, 38.0); glend(); glflush(); // white background // ignore it for now // set projection // start primitive // set color of vertex // send coords of vertex // next vertex, same color // dark red // end primitive // force completion Graphik-Pipeline 19

The Pipeline with Regards to Data Flow Force input to canonical format Convert to internal representation E.g., x, y to float Initialize unspecified values E.g., z = 0, w=1 Insert current modal state E.g., color to (0, 0.5, 0, 1) In our example: struct { float x,y,z,w; float r,g,b,a; float normal[3]; } vertex; struct { float x,y,z,w; // 11, 31, 0, 1 float r,g,b,a; // 0, 0.5, 0, 1 } vertex; struct { float x,y,z,w; // 37, 71, 0, 1 float r,g,b,a; // 0, 0.5, 0, 1 } vertex; Application Vertex assembly Framebuffer Display Graphik-Pipeline 20

Transform coordinates 4x4 matrix arithmetic Compute (per-vertex) lighting Compute texture coordinates, if procedurally defined Application Vertex assembly Vertex operations Framebuffer Display Graphik-Pipeline 21

Group vertices into primitives: points, lines, or triangles Old pipe: Decompose polygons to triangles Duplicate vertices in strips or fans In our example: 0 Create two triangles out of the polygon 1 2 3 struct { vertex v0,v1,v2; } triangle; or struct { vertex v0,v1; } line; or struct { vertex v0; } point; Application Vertex assembly Vertex operations Primitive assembly Framebuffer Display Graphik-Pipeline 22

Clip to the window boundaries Perform back-face / front-face operations Backface culling Color assignment for 2-sided lighting In our example: nothing happens Application Vertex assembly Vertex operations Primitive assembly Primitive operations Framebuffer Display Graphik-Pipeline 23

Determine which pixels are included in the primitive Generate a fragment for each such pixel Calculate attributes (e.g., color) for each fragment In our example: Application Vertex assembly Vertex operations Primitive assembly Primitive operations Rasterization struct { int x,y; float depth; float r,g,b,a; } fragment; Framebuffer Display Graphik-Pipeline 24

Depth testing (aka z-buffering) Texture mapping Fog Scissor test Alpha test Color blending In our example: nothing to be done Result: struct { int depth; byte r,g,b,a; } pixel; Application Vertex assembly Vertex operations Primitive assembly Primitive operations Rasterization Fragment operations Framebuffer Display Graphik-Pipeline 25

Primitive in OpenGL Points Lines Line-Strip Line-Loop Dreiecke Band aus Dreiecken (Triangle Strip) Fächer aus Dreiecken (Triangle Fan) Graphik-Pipeline 27

Nicht mehr verfügbare Primitive (außer im compatibility profile): Polygone Vierecke (Quad / Quadrangle) Band aus Vierecken (Quad Strip) Graphik-Pipeline 28

Fixed-Function and Programmable Pipelines auf der GPU OpenGL 1: Fixed Function Pipeline Sehr sorgfältig ausbalanciert Einfachheit über Performance glbegin(gl_ ) glenable, gllight, Status Memory Host Commands glvertex Vertex Transform Cull, Clip & Project Assemble and Rasterize Primitive Fragment Processing Texture Memory Per- Fragment Operations Frame Buffer Operations Frame Buffer Display glteximage Pixel Pack & Unpack Read Back Control Graphik-Pipeline 29

OpenGL 2: teilweise programmierbare Pipeline (sog. Shaders) Vertex / Fragment Shader: legen offen, was sowieso schon immer da war Texturspeicher = allgemeiner Speicher für beliebige Daten glbegin(gl_ ) glenable, Status Memory Host Commands glvertex Vertex Processing Cull, Clip & Project Assemble and Rasterize Primitive Fragment Processing Per- Fragment Operations Frame Buffer Operations Frame Buffer Display glteximage Pixel Pack & Unpack Texture Memory Read Back Control Graphik-Pipeline 30

Der Immediate Mode Immediate Mode ("direkter Modus"): Primitive werden sofort, wenn sie festgelegt sind, an das Display geschickt (Standard) Die GPU kennt immer nur die Primitive, die aktuell durch die Pipeline laufen Weiteres Beispiel: glbegin( GL_LINES ); glcolor3f ( 1.0, 0.0, 0.0 ); glvertex3f( 0.0, 0.0, 0.0 ); glvertex3f( 1.0, 0.0, 0.0 ); glcolor3f ( 0.0, 1.0, 0.0 ); glvertex3f( 0.0, 0.0, 0.0 ); glvertex3f( 0.0, 1.0, 0.0 ); glcolor3f ( 0.0, 0.0, 1.0 ); glvertex3f( 0.0, 0.0, 0.0 ); glvertex3f( 0.0, 0.0, 1.0 ); glend(); G. Zachmann Computergraphik 1 WS 14 November 2017 Graphik-Pipeline 31

Der Retained Mode Retained Mode ("zurückhaltender Modus"): Primitive werden in sog. Buffer Objects gespeichert (Vertex Buffer Objects und Vertex Array Objects) VBO's können auf der GPU (Graphikkarte) gehalten werden Performance - GPU erhält noch weitere Möglichkeiten zur Optimierung Kann mehrmals mit unterschiedlichen Eigenschaften gezeichnet werden VBO's können verschieden kombiniert werden Vertex Data (VBO & VAO) Vertex Shader Primitive Setup and Rasterization Fragment Shader Framebuffer (w/ blending) Graphik-Pipeline 32

Weitere Features in OpenGL 3: Kontext-Profile: - Core: keine Fixed-Function-Pipeline, nur Dreiecke, keine Quads / Polygone,... - Compatibility: rückwärts-kompatibel bis OpenGL 1.0 Weitere Shader (Geometry Shader) In OpenGL 4: Noch mehr Shader (Tesselation Shader, Compute Shader) Graphik-Pipeline 33

Der Vertex Shader Berechnung der Position im Raum für jeden(!) Vertex (später mehr) out-variablen stellen die Verbindung zum Fragment Shader her gl_position ist eine vordefinierte out-variable, muss gesetzt werden Beispiel: #version 330 // OpenGL 3.3 oder höher uniform mat4 matrix; // Transformationsmatrix in vec3 vposition; in vec3 vcolor; // Position des Vertex // Farbe des Vertex out vec3 fcolor; // ausgehende Farbe des V. void main() { fcolor = vcolor; gl_position = matrix * vec4(vposition, 1.0); } Schnittstelle zur Host-Seite Uniforms matrix Attributes vposition vcolor Graphik-Pipeline 35

Der Fragment Shader Berechnet letzten Endes die Farbe für jedes ausgegebene Fragment Beispiel: #version 330 uniform float alpha; // vom Vertex Shader / Rasterizer in vec3 fcolor; // OpenGL 3.3 or higher Schnittstelle zur Host-Seite Uniforms alpha // einzige Ausgabe: die Farbe des Fragments out vec4 color; void main() { color = vec4( fcolor, alpha ); } Graphik-Pipeline 36

Das Shader-Programm Attribute können vom Host nur dem Vertex Shader übergeben werden Unbenutzte Variablen werden wegoptimiert Vertex Shader Uniforms matrix Attributes vposition vcolor Fragment Shader Uniforms alpha Shader Programm ID: Uniform 0: matrix 1: alpha ID: Attribute 0: vposition 1: vcolor // ID's / Handles zu den jeweiligen Variablen/Attributen GLint matrixuni = glgetuniformlocation(shprog, "matrix"); // 0 GLint alphauni = glgetuniformlocation(shprog, "alpha"); // 1 GLint vpositionattr = glgetattriblocation(shprog, "vposition"); // 0 GLint vcolorattr = glgetattriblocation(shprog, "vcolor"); // 1 GLint error = glgetattriblocation(shprog, "unknown"); // -1 Graphik-Pipeline 38

Prinzipielle Vorgehensweise des Renderns Shader kompilieren und zu Shader-Programm linken IDs der Attribute und Uniforms aus dem Shaderprogramm auslesen Buffer erzeugen Vertex Buffer Object (VBO): für Vertex-Attribute (Position, Farbe, Normale, Textur,...) Layout der Buffer bekannt geben: welches Attribut steht an welcher Stelle im Array "Verbindung" zwischen Attributen und Shader-Variablen (IDs) Vertex Array Object (VAO): verweist auf die VBO's Buffer mit Daten füllen Konkrete Werte an die Uniforms zuweisen Buffer Object rendern (mit aktivem Shader-Programm & VAO) Während eines Frames können Shader, VAOs, VBOs, Uniforms geändert werden Graphik-Pipeline 39

Generieren der Buffers Vertex Array Object Attributes 0: // generate vertex buffer object on the GPU glgenbuffers( 1, &m_vertices_buffer ); // set it as the active VBO (think "state") glbindbuffer(gl_array_buffer, m_vertices_buffer); // copy actual vertex coords into the VBO glbufferdata( GL_ARRAY_BUFFER, sizeof(vertices), (void*)vertices, GL_STATIC_DRAW ); verweist Vertex Buffer Object 1:... verweist Vertex Buffer Object GLuint my_obj; // Handle auf neues VAO glgenvertexarrays( 1, & my_obj ); // erstelle 1 Vertex Array Object glbindvertexarray( my_obj ); // setze my_obj als aktives VAO Achtung: für alle Code-Beispiele im Folgenden nehmen wir an, dass glbindvertexarray(my_obj) noch aktiv ist! Graphik-Pipeline 40

Beispiel (mit einem VBO pro Attribut) // Vertex positions (XYZ) float * position = { 0.0, 0.0, 0.0, // Ursprung 1.0, 0.0, 0.0, // x-achse 0.0, 0.0, 0.0, // Ursprung 0.0, 1.0, 0.0, // y-achse 0.0, 0.0, 0.0, // Ursprung 0.0, 0.0, 1.0}; // z-achse // Vertex colors (RGB) float * color = { 1.0, 0.0, 0.0, // rot 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, // grün 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, // blau 0.0, 0.0, 1.0}; glgenbuffer( 1, &position_buffer ); // create (empty) VBO glbindbuffer(gl_array_buffer, position_buffer); // use it glbufferdata(gl_array_buffer, sizeof(position), position, GL_STATIC_DRAW);... glgenbuffer( 1, &color_buffer ); // again for colors glbindbuffer(gl_array_buffer, color_buffer); glbufferdata(gl_array_buffer, sizeof(color), color, GL_STATIC_DRAW);... Graphik-Pipeline 41

Verbindung zwischen VBO und Shader-Variablen herstellen Shader Programm ID: Sh.-Var. 0: vposition 1: vcolor glbindbuffer( GL_ARRAY_BUFFER, position_buffer ); glbufferdata(... ); glenablevertexattribarray( vpositionattr ); glvertexattribpointer( vpositionattr, // ID of variable in shader prog 3, // # floats per attrib. GL_FLOAT, // Type GL_FALSE, // Normalized? 3*sizeof(float), // Stride length 0 // Offset in VBO (in bytes) );... Vertex Array Obj Attrib. ID : VBO 0: position_buffer Stride length = 3 * sizeof(float) p0 p1 p2 p3... 1: Graphik-Pipeline 42

Verbindung zwischen VBO und Shader-Variablen herstellen Shader Programm ID: Sh.-Var. 0: vposition 1: vcolor glbindbuffer( GL_ARRAY_BUFFER, color_buffer ); glbufferdata(... ); glenablevertexattribarray( vcolorattr ); glvertexattribpointer( vcolorattr, // ID of variable in shader prog 3, // # floats per attrib. GL_FLOAT, // Type GL_FALSE, // Normalized? sizeof(float[3]), // Stride length 0 // Offset in VBO (in bytes) );... Vertex Array Obj Attrib. ID : VBO 0: position_buffer 1: color_buffer p0 p1 p2 p3... c0 c1 c2 c3... v0 v1 v2 v3 Graphik-Pipeline 43

Rendering gldrawarrays( GL_LINES, // render mode 0, // offset in bytes 3 * 2 // # vertices ); Graphik-Pipeline 44

Beispiel mit interleaved Vertex Layout (nur ein VBO) struct VertexData { float position[3]; float color[3]; }; // Vertex Positionen (XYZ, RGB) VertexData * vertices = { {{0.4, -0.2, 0.2}, {1.0, 0.0, 0.0}}, // v0, rot {{-0.1, 0.8, 0.3}, {0.0, 1.0, 0.0}}, // v1, grün {{-0.2, 0.3, 0.1}, {0.0, 0.0, 1.0}}, // v2, blau {{-0.1, -0.2, 0.5},{1.0, 1.0, 1.0}}, // v3, weiß {{0.8, 0.2, 0.1}, {0.0, 0.0, 0.0}}, // v4, schwarz {{0.3, 0.4, 0.0}, {0.5, 0.5, 0.5}} // v5, grau }; Graphik-Pipeline 46

VBO erzeugen und füllen glgenbuffer( 1, &vertices_buffer ); glbindbuffer(gl_array_buffer, vertices_buffer ); glbufferdata(gl_array_buffer, sizeof(vertices), vertices, GL_STATIC_DRAW); p0 c0 p1 c1 p2 c2 p3 c3 p4... v0 v1 v2 v3 Graphik-Pipeline 47

Verbindungen herstellen Shader Program ID: Sh.-Var. 0: vposition 1: vcolor glenablevertexattribarray( vpositionattr ); glvertexattribpointer( vpositionattr, 3, // # floats per attrib. GL_FLOAT, // Type GL_FALSE, // Normalized? sizeof(vertexdata), // Stride length 0 // Offset in the VBO ); Vertex Array Obj Attrib. ID : VBO 0: vertices_buffer 1: Stride length = sizeof(vertexdata) p0 p1... v0 v1 Graphik-Pipeline 48

Verbindungen herstellen Shader Program ID: Sh.-Var. 0: vposition 1: vcolor Vertex Array Obj Attrib. ID : VBO 0: vertices_buffer 1: vertices_buffer glenablevertexattribarray( vcolorattr ); glvertexattribpointer( vcolorattr, 3, // # floats per attrib. GL_FLOAT, // Type of attr: float GL_FALSE, // Normalized? sizeof(vertexdata), // Stride length 3*sizeof(float) // Offset in the VBO ); vertices_buffer p0 c0 p1 c1... Offset Stride length = sizeof(vertexdata) v0 v1 Graphik-Pipeline 50

Rendering gldrawarrays( prim_type, 0, 3*2 ); GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_TRIANGLES Graphik-Pipeline 51

Bemerkung Manchmal könnte es praktisch sein, eine eigene "VAO-Klasse" zu schreiben, die ein Interface ähnlich zum immediate mode hat: // Initialisierung VertexArrayObject vao = new VertexArrayObject( num_vertices ); vao->begin( GL_TRIANGLES ); vao->addvertex( 0.0, 0.0, 0.0 ); vao->addvertex( 0.5, 0.75, 0.0 ); vao->addvertex( -0.5, -0.25, 0.0 );... vao->end(); // display vao->draw(); Graphik-Pipeline 52

OpenGL Cheat Sheet zu VAO's & VBO's Vertex Shader glvertexattribpointer Shaderprogram enthält u.a. Liste von Uniforms // globale Werte Liste von Attributen // Werte pro Vertex Link Fragment Shader weitere... glgetuniformlocation glgetattriblocation glcreateshader glshadersource glcompileshader glcreateprogram glattachshader gllinkprogram gluseprogram Vertex Array Object glgenvertexarrays glbindvertexarray Link glenablevertexattribarray glvertexattribpointer Vertex Buffer Object glgenbuffers glbindbuffer glbufferdata Graphik-Pipeline 53

Microsoft Excel: Revolutionary 3D Game Engine? J http://cgvr.cs.uni-bremen.de/teaching/cg_literatur/excel_3d_engine/ Graphik-Pipeline 54

Qt Ab hier nur zu Ihrer Information! Ein API zur Entwicklung von Applikationen mit GUI Vorteile: Cross-platform Wird von vielen professionellen Software-Herstellern eingesetzt Enthält viele weitere, hilfreiche Funktionalität (zusätzlich zum Window- Management und Handling von User-Input) Wird von einem starken Konsortium weiterentwickelt Graphik-Pipeline 55

Konzept einer Qt-Applikation Merkregel: Almost everything is a widget! Widget steht für "window gadget" (= "Fenster-Ding") Widgets sind die Bausteine eines Windows oder GUIs - Z.B.: Buttons, Sliders, Graphik-Fenster, Rahmen-Fenster, Jede (!) Qt-Applikation enthält Instanzen von Widgets oder speziellen Versionen von Widgets Graphik-Pipeline 56

Ein einfaches QT-Programm #include <QApplication> #include <QPushButton> int main(int argc, char* argv[]) { QApplication app(argc, argv); QPushButton hello( Hallo Welt! ); hello.resize(100,30); hello.show(); return app.exec(); } Graphik-Pipeline 57

Signals und Slots liefern Inter-Objekt Kommunikation. Idee: - Objekte, die nichts voneinander wissen, können miteinander verbunden werden Jede von QObject abgeleitete Klasse kann Signals deklarieren, die von Funktionen der Klasse ausgestoßen (emit) werden können. Jede von QObject abgeleitete Klasse kann Slots definieren. Slots sind identisch zu Funktionen; zusätzlich können sie mit Signals "verbunden" werden. Zusätzliche Voraussetzung: - in der Klassendeklaration muss das Q_OBJECT-Makro aufgerufen werden. Die Signals und Slots von Objektinstanzen können miteinander verbunden werden. - Wird ein Signal S von Objekt A mit einem Slot T von Objekt B verbunden, und stößt Objekt A das Signal S aus, so wird Slot T von Objekt B aufgerufen. (Erinnerung: Slots sind Funktionen) Graphik-Pipeline 58

Beispiel: connect( button, SIGNAL(clicked()), qapp, SLOT(quit()) ); Graphik-Pipeline 59

Beispiel mit Signals and Slots #include <QApplication> #include <QPushButton> int main(int argc, char* argv[]) { QApplication app(argc, argv); QPushButton hello("hello World!"); hello.resize(100,30); hello.show(); QObject::connect( &hello, SIGNAL(clicked()), app, SLOT(quit()) ); return app.exec(); } Graphik-Pipeline 60

Kompilieren von Qt-Anwendungen Jede Plattform hat eigene Tools (Compiler, Linker, make- Programm) Qt benötigt zusätzlich Tools (moc, uic) Erstellen von Qt-Applikationen unter Linux: qmake -project generiert Projektdatei (.pro) qmake erstellt aus ihr ein Makefile make erstellt ausführbare Dateien Graphik-Pipeline 61

Ein einfaches Qt-Programm mit OpenGL #include <QApplication> #include <QSurfaceFormat> #include "window.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); // configure OpenGL QSurfaceFormat format; format.setversion(3, 3); // OpenGL 3.3 Core format.setprofile(qsurfaceformat::coreprofile); format.setsamples(16); // multisampling: anti-aliasing QSurfaceFormat::setDefaultFormat(format); // create window and make it visible Window window; window.show(); } return app.exec(); Graphik-Pipeline 62

Qt und OpenGL #include <QOpenGLFunctions_3_3_Core> #include <QOpenGLWidget> //... class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core { Q_OBJECT public: GLWidget(QWidget * parent = 0); ~GLWidget(); protected: void initializegl() Q_DECL_OVERRIDE; void resizegl(int w, int h) Q_DECL_OVERRIDE; void paintgl() Q_DECL_OVERRIDE; public Q_SLOTS: //... Q_SIGNALS: //... }; Graphik-Pipeline 63

Qt und OpenGL void GLWidget::initializeGL() { initializeopenglfunctions(); glclearcolor(1.0, 1.0, 1.0, 1.0); glenable(gl_depth_test); } // prepare shader programs, buffer, enable settings,... void GLWidget::paintGL { glclear( GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT ); }; // bind programs and buffers and draw arrays/elements till everything is fine Graphik-Pipeline 64