Praktikum Computergrafik

Ähnliche Dokumente
3D Programmierpraktikum: OpenGL Shading Language (GLSL)

Computer Graphics Shader

Advanced Computer Graphics 1. Übung

Programmierpraktikum 3D Computer Grafik

Shader. Computer Graphics: Shader

Computergrafik Universität Osnabrück, Henning Wenke,

Proseminar: Virtuelle Präsenz. Vortrag: Steve Rechtenbach

Computergrafik 1 Übung

Seminar Game Development Game Computer Graphics. Einleitung

Spieleprogrammierung mit DirectX und C++

GL ShadingLanguage(GLSL)

Computergraphik I Die Graphik-Pipeline &

Praktikum: Spieleengine im Eigenbau

Praktikum Augmented Reality Fernrohr -Felix Löhr-

Computergrafik II. OpenGL Einführung

OpenGL auf Mac OS X und ios

Wiederholung. Vorlesung GPU Programmierung Thorsten Grosch

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

SS08, LS12, Friedrich-Alexander-Universität Erlangen Florian Hänel, Frederic Pollmann HS Multicore Architectures and Programming GPU EVOLUTION

OpenGL und die Fixed-Function-Pipeline

Game Engine Architecture and Development. Effekte (Sound, Partikel, Physik)

Grafikkarten-Architektur

Computergrafik Universität Osnabrück, Henning Wenke,

Übungsblatt 10: Klausurvorbereitung

Gliederung. Blending Licht Anwendungsbeispiel Optimierung OpenGL heute und morgen Wilfried Mascolus - OpenGL Teil II 2/20

Kapitel 4: Schattenberechnung

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

Computergrafik. Peter Rösch Hochschule Augsburg University of Applied Sciences. Sommersemester Version: 24. März 2014

Softwareprojekt Spieleentwicklung

Probelektion zum Thema. Shadow Rendering. Shadow Maps Shadow Filtering

Jörn Loviscach Hochschule Bremen

Die Welt der Shader. Fortgeschrittene Techniken III

Jens Konerow. Managed DirectX und C#

(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

Grundlagen der Spieleprogrammierung

Einführung in Truevision3D

Computergrafik Universität Osnabrück, Henning Wenke,

Übung: Computergrafik 1

Übungsstunde 5 zu Computergrafik 1

Eine Einführung Computergrafik SS14 Timo Bourdon

Integration von 3D-Visualisierungstechniken in 2D-Grafiksystemen

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

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

HTBLuVA Innsbruck DIPLOMARBEIT. 3D Grafik (Game) Tutorial mit OpenGL R Trainings-LiveCD. Teil 2: Tutorial

Seminar: Programmierung von Grafikkarten (SS 2006)

Shader zur Bildbearbeitung

Architektur moderner GPUs. W. Sczygiol - M. Lötsch

Computer Graphik (CS231) Projektübungsblatt 3

OpenGL. (Open Graphic Library)

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

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

General Purpose Computation on GPUs

Computergrafik Universität Osnabrück, Henning Wenke,

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

3D Programmierpraktikum: Szenegraphen und Texturierung

Geometrische Primitive und Hidden Surface Removal

Bitmaps. - Definition eigener Zeichenmuster - Definition eigener Schriften. Zeichnen auf Pixel- und Bitmap-Ebene

Visualisierung und Volumenrendering 2

UV Texturen (UV Mapping)

7.4 Tesselierung von Polygonen

Universität Trier FB IV Mathematik PS Mathematics for 3D Game Programming & Computer Graphics - WS 07/08 Seminarleiter: Prof. Dr.

Blatt 8. Einführung in vmd. Grundlagen. Gestaltung. Beispiel. Blatt 8. Weitere

EPA-Präsentation Tim Keller

Kapitel 5: Graphikhardware und Parallelisierung

Computergrafik Universität Osnabrück, Henning Wenke,

(5) GPU Programmierung

Thema: Hardware-Shader

Prozedurale Texturen >>Was nicht passt wird passend gemacht...<<

CAUSTICS & GODRAYS. Jacob Skuratovski

PRIP-Preis. Effizientes Object Tracking durch Programmierung von Mehrkernprozessoren und Grafikkarten

Szenengraphen. Codruţa Cosma. Universität Ulm Sommersemester 2005

Shader für Geometrische Grundprimitive. Beispielszene mit vielen Kegeln unterschiedlicher Größe und Farbe

PostScript-Ausgabe von OpenGL

Interaktives Wasser in 3D. Jörn Loviscach Hochschule Bremen

3D Programmierpraktikum: Schattenberechnung in Echtzeit

Scalable Vector Graphics (SVG)

Transkript:

Praktikum Computergrafik Steven Schlegel Abteilung für Bild- und Signalverarbeitung Betreuer: Steven Schlegel (schlegel@informatik.uni-leipzig.de)

Einführung in OpenGL und GLSL

OpenGL OpenGL (Open Graphics Library) plattform- und programmiersprachenunabhängige Programmierschnittstelle zur Entwicklung von 2D- und 3D-Computergrafik ermöglicht die Darstellung komplexer 3D-Szenen in Echtzeit Implementierung ist normalerweise durch Grafikkartentreiber gewährleistet (hardwarebeschleunigt), ansonsten auf der CPU Windows-Pendant: Direct3D

OpenGL Bekannte Engines: GrimE-Engine (Escape From Monkey Island) Id Tech 4/5 Engine (Doom 3, Brink, Rage) Aurora Engine (Neverwinter Nights) Source Engine (Half Life 2) Unreal Engine (Goat Simulator)

OpenGL Einführung - Geometrie Komplexe 3D-Modelle bestehen immer aus geometrischen Primitiven Im Praktikum: Beschränkung auf Dreiecke (GL_TRIANGLES) Primitive bestehen immer aus Vertices (Eckpunkte). Jeder Vertex kann mehrere Attribute haben (Position, Farbe, Normale...).

OpenGL Einführung - Geometrie 0, 1, 0 Bsp: Zeichnen des Dreiecks -1, -1, 0 1, -1, 0 Bildschirmkoordinaten: 1, 1-1, -1 Positionen der Vertices in Array speichern: GLfloat pos_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, };

OpenGL Einführung - Geometrie Diese Daten werden als sogenannte Buffer auf der Grafikkarte gespeichert: GLuint positionbuffer; //Buffer erstellen glgenbuffers(1, &positionbuffer); //Buffer als aktiv setzen (OpenGL ist eine State Machine) glbindbuffer(gl_array_buffer, positionbuffer); //den Buffer mit den Positionsdaten befüllen glbufferdata(gl_array_buffer, sizeof(pos_data), pos_data, GL_STATIC_DRAW); Zeichnen der Daten mittels gldrawarrays: glbindbuffer(gl_array_buffer, positionbuffer); //VertexAttribute festlegen glvertexattribpointer(0, //wichtig für shader (später) 3, //Größe eines Vertexattributes GL_FLOAT, //Datentyp GL_FALSE, //normalisiert 0, //stride (void*) 0 //Offset im Buffer ); //Zeichnen gldrawarrays(gl_triangles, 0, 3);

OpenGL Einführung - Geometrie Ergebnis:

OpenGL Einführung - Geometrie Ergebnis: Langweilig!

OpenGL Einführung - Geometrie Frage: Wie macht man so etwas?

OpenGL Einführung - Geometrie Frage: Wie macht man so etwas? oder so etwas?

OpenGL Einführung - Geometrie Frage: Wie macht man so etwas? oder so etwas? oder auch das?

OpenGL Einführung - Shader Antwort: mit Shadern Shader sind Programme, die direkt auf der Grafikkarte ausgeführt werden die Grafikkarte ist eine frei programmierbare Multiprozessorplatform Mehrere Arten von Shadern hier Beschränkung auf die 2 wichtigsten Shader: Vertex- und Fragmentshader (es gibt noch Geometry-, Tesselation- und Computeshader)

OpenGL Einführung - Shader Shader Pipeline: OpenGL übergibt Vertex mit verschiedenen Eigenschaften (Position, Farbe, Texturkoordinaten usw.) Vertexshader bearbeitet den Vertex und evtl. die übergebenen Eigenschaften Pixelshader bekommt die interpolierten Eigenschaften (z.b. Vertexfarbe) und färbt das Pixel im Framebuffer

OpenGL Einführung - Shader GLSL: Programmiersprache für Shader DirectX-Pendant: HLSL Syntax entspricht im Wesentlichen ANSI-C wurde um spezielle Datentypen erweitert, wie z.b. Vektoren, Matrizen und Sampler (für Texturzugriffe) Tutorial z.b. unter http://www.opengl-tutorial.org/

OpenGL Einführung - Shader Bsp: Vertex Shader

OpenGL Einführung - Shader Bsp: Fragment Shader

OpenGL Einführung - Shader Ergebnis: Eingabe Vertexattribute 0, 1, 0-1, -1, 0 1, -1, 0 GLfloat pos_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; GLfloat col_data[] = { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, }; Uniforms: somematrix = Einheitsmatrix; scale = 1.0f;

OpenGL Einführung - Shader Ergebnis: Eingabe Vertexattribute 0, 1, 0-1, -1, 0 1, -1, 0 GLfloat pos_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; GLfloat col_data[] = { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, }; Uniforms: somematrix = Einheitsmatrix; scale = 1.0f;

OpenGL Einführung - QGL Problem: OpenGL API z.t. recht umständlich Keine native Unterstützung für spezielle GLSL Datentypen (Vectoren, Matrizen) es existieren viele Wrapper für OpenGL, die versuchen diese Nachteile aufzuwiegen

OpenGL Einführung - QGL Problem: OpenGL API z.t. recht umständlich Keine native Unterstützung für spezielle GLSL Datentypen (Vectoren, Matrizen) es existieren viele Wrapper für OpenGL, die versuchen diese Nachteile aufzuwiegen Wir benutzen Qt

OpenGL Einführung - QGL Qt: http://qt-project.org/ platformunabhängiges Anwendungs und UI Framework hauptsächlich benutzt zum Erstellen von GUI-Anwendungen mit C++ CGViewer ist mit Qt geschrieben Unterstützt auch die die Darstellung GPU-beschleunigter Inhalte mittels OpenGL besitzt auch OpenGL-Wrapperklassen und eigene Vector/Matrix Klassen, die entsprechend mit den OpenGL-Wrappern zusammenarbeiten

OpenGL Einführung - QGL Qt Klassen: Vectoren: z.b. QVector2D, QVector3D, QVector4D Matrizen: z.b. QMatrix3x3, QMatrix4x4 Buffer: QGLBuffer //translation matrix QMatrix4x4 translation; translation.translate(dx, dy, dz); QGLBuffer positionbuffer = QGLBuffer( QGLBuffer::VertexBuffer ); positionbuffer.setusagepattern( QGLBuffer::StaticDraw ); positionbuffer.create(); positionbuffer.allocate( &positions[0], positions.size()*sizeof(qvector3d) ); //bind the buffer positionbuffer.bind(); Shader program: QGLShaderProgram (creation) QGLShaderProgram pr; pr.addshaderfromsourcefile(qglshader::vertex, vertexshadersource); pr.addshaderfromsourcefile(qglshader::fragment, fragmentshadersource); pr.link();

OpenGL Einführung - QGL Qt Klassen: Shader program (Frts.): QGLShaderProgram (drawing) //set the program active pr.bind(); //set the uniforms in the shader QMatrix4x4 matrix; pr.setuniformvalue( pr.uniformlocation("somematrix"), matrix ); pr.setuniformvalue( pr.uniformlocation("scale"), 1.0f ); //enable the vertex attributes (one for positions, one for colors) pr.enableattributearray( pr.attributelocation("position") ); pr.enableattributearray( pr.attributelocation("color") ); //tell the shader, which data the vertex attributes should use positionbuffer.bind(); pr.setattributebuffer( pr.attributelocation("position"), GL_FLOAT, 0, 3 ); colorbuffer.bind(); pr.setattributebuffer( pr.attributelocation("color"), GL_FLOAT, 0, 3 ); //draw gldrawarrays(gl_triangles, 0, 3); //deactivate program pr.release();

CGViewer Framework, welches im Laufe des Praktikums erweitert werden soll

CGViewer Framework, welches im Laufe des Praktikums erweitert werden soll Features triangulierte Modelle im Wavefront OBJ-Format laden (http://de.wikipedia.org/wiki/wavefront_obj) Modelle können frei in der Szene bewegt, rotiert und skaliert werden Hinzufügen von mehreren Lichtquellen zur Szene Laden und Speichern von Szenen Anzeigen der Szene erfolgt mittels OpenGL und der im Praktikum erstellten Shader

CGViewer Wichtige Dateien/Klassen Klasse Model Dateien Model.h, Model.cpp besitzt statische Funktion zum laden von Modellen verwaltet ein geladenes Modell mitsamt aller nötiger Buffer verwaltet die Modellbewegung in der Szene (Koordinaten) Besitzt eine render-funktion, um sich zu zeichnen der render-funktion wird ein Shaderprogram übergeben, mit dem sich das Modell rendern soll

CGViewer Wichtige Dateien/Klassen Klasse Light (erbt von Model) Dateien Light.h, Light.cpp wird immer als Kugel dargestellt besitzt zudem Funktionen zum setzen und auslesen von Farb/LichtInformationen

CGViewer Wichtige Dateien/Klassen Klasse Scene (erbt von QGLWidget) Dateien Scene.h, Scene.cpp reagiert auf Mauseingaben des Nutzers (z.b. für Kamerabewegungen) verwaltet das Shaderprogram (QGLShaderProgram *m_program) verwaltet die geladenen Modelle (std::vector< std::shared_ptr<model> > models) zeichnet die Szene alle 33ms neu Funktion void paintgl(), ruft die render-funktion aller geladenen Modelle auf

CGViewer Wichtige Dateien/Klassen Datei CGTypes.h beinhaltet ein paar spezielle Datentypen wichtig ist vor allem die struct Material wird in den entsprechenden Aufgabenstellungen näher erläutert

CGViewer Wichtige Dateien/Klassen Shader sind im Unterverzeichnis Shader abgelegt: VertexShader: vertex.glsl FragmentShader: fragment.glsl werden von der Scene automatisch geladen: void reloadshader() während der Aufgaben werden neue Shaderdateien hinzugefügt