Kurzeinführung in OpenGL(ES)



Ähnliche Dokumente
Graphic Coding. Klausur. 9. Februar Kurs A

I - Phone 3D 3D Spieleentwicklung für's I-Phone

Computergrafik 1 Übung

Einführung in die Java- Programmierung

SEP 114. Design by Contract

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

OpenGL auf Mac OS X und ios

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Praktikum Schau Geometrie

Zählen von Objekten einer bestimmten Klasse

Programmierkurs Java

Softwareprojekt Spieleentwicklung

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Einführung in die Programmierung

Dokumentation für das Spiel Pong

DER WING COMMANDER CD³² GUIDE

Der Kalender im ipad

Einführung in die Java- Programmierung

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Abschlussprüfung Realschule Bayern II / III: 2009 Haupttermin B 1.0 B 1.1

OECD Programme for International Student Assessment PISA Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

Objektorientierte Programmierung. Kapitel 12: Interfaces

2D-Transformationen. Kapitel Translation. 6.2 Skalierung

Software Engineering Klassendiagramme Assoziationen

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Übung 1. Explorer. Paint. Paint. Explorer

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

OpenGL. (Open Graphic Library)

Java: Vererbung. Teil 3: super()

Testen mit JUnit. Motivation

GUI Programmierung in Java

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Anleitung zum erstellen einer PDF-Datei aus Microsoft Word

OS Anwendungsbeschreibung

Übung Bilder verschmelzen

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

Anleitung RÄUME BUCHEN MIT OUTLOOK FÜR VERWALTUNGSANGESTELLTE

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

Objektbasierte Entwicklung

OP-LOG

Installation von MailON2!

Programmieren mit DirectX

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

cardetektiv.de GmbH Kurzanleitung Version 4.0 Software Cardetektiv Zukauf, Preisfindung, Marktanalyse Autor Christian Müller

Print2CAD 2017, 8th Generation. Netzwerkversionen

5. Abstrakte Klassen

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Übung - Datensicherung und Wiederherstellung in Windows 7

Virtual Private Network

Applet Firewall und Freigabe der Objekte

teamsync Kurzanleitung

5. Tutorium zu Programmieren

KeePass Anleitung. 1.0Allgemeine Informationen zu Keepass. KeePass unter Windows7

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

plus Flickerfeld bewegt sich nicht

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG

Flugzeugen einen Glanz aufmalen

FL1 Hosting Technische Informationen

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Der monatliche Tarif für ein Handy wurde als lineare Funktion der Form f(x) = k x + d modelliert (siehe Grafik).

Programmieren Tutorium

1. Sichtbarkeitsproblem beim Rendern einer dreidimensionalen Szene auf einer zweidimensionalen

Modellierung und Programmierung 1

Arbeiten mit UMLed und Delphi

Grundlagen von Python

Anlage eines neuen Geschäftsjahres in der Office Line

Anleitung über den Umgang mit Schildern

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

1 Mathematische Grundlagen

OSF Integrator für Btracking und Salesforce Anleitung für die Nutzer

Navigation. Drucken Klicken Sie auf ein Symbol, um nähere Informationen zu erhalten. Papierhandhabung Anzeigen der Online-Informationen

Objektorientierte Programmierung

Bilder Schärfen und Rauschen entfernen

Windows 7 Winbuilder USB Stick

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Satzhilfen Publisher Seite Einrichten

Kurzeinführung Excel2App. Version 1.0.0

Herstellen von Symbolen mit Corel Draw ab Version 9

ways2gether ipad App Guide

Die Invaliden-Versicherung ändert sich

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

MSXFORUM - Exchange Server 2003 > SMTP Konfiguration von Exchange 2003

EasyProfil unter Windows 7 64-Bit Home Premium (Die Installation der VirtualBox und EasyProfil)

Vorkurs C++ Programmierung

2. Semester, 2. Prüfung, Lösung

Zeichen bei Zahlen entschlüsseln

Leichte-Sprache-Bilder

ACDSee 2009 Tutorials: Rote-Augen-Korrektur

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

How to install freesshd

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Umwandeln und Exportieren von Adobe-Illustrator-Dateien in Illustrator für Artcut

Software Engineering Interaktionsdiagramme

Ebenenmasken Grundlagen

Video-Tutorial: Einrichten einer Facebook Landing Page in der Facebook Chronik (Timeline)

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Transkript:

Kurzeinführung in OpenGL(ES) Matthias Braun matthias.braun@kit.edu Institut für Programmstrukturen und Datenorganisation Lehrstuhl für Programmierparadigmen Wintersemester 2009/10 Wintersemester 2009/10 1 / 34

1 Einleitung 2 OpenGL-Kontexte 3 Geometrie und Projektion 4 Transformation 5 Zeichnen 6 Farben und Texturen 7 Sonstiges 8 Literatur Wintersemester 2009/10 2 / 34

Was ist OpenGL? Open Graphics Library (OpenGL) Ist eine Bibliothek zur Ansteuerung von Grafikhardware Platform und Programmiersprachenunabhängig Darstellung komplexer 3D-Szenen in Echtzeit Heute Standardschnittstelle auf praktisch allen Platformen mit 3D-Unterstützung. (Auf Microsoft-Systemen allerdings Dominanz von Direct-3D) Wintersemester 2009/10 3 / 34

Was ist OpenGL ES? Open Graphics Library for Embedded Systems (OpenGL ES) Abgespeckte Version von OpenGL für eingebettete Systeme Entfernung von Altlasten (glbegin, glend) Beschränkung der Datentypen (kein double) Einsatz zum Beispiel auf iphone, Android, Playstation 3. Wintersemester 2009/10 4 / 34

Zeichenbereich der OpenGL-Kontext Ein OpenGL-Kontext ist ein 2-dimensionaler rechteckiger Bereich. Typischerweise ein Programmfenster oder der ganze Bildschirm. Die Bereitstellung eines Kontextes ist Architekturabhängig. OpenGL ist nur zum Zeichnen auf den Kontext verantwortlich. Dinge wie Tastatur, Touchpad oder Zeitmessung werden anderen Bibliotheken überlassen. Typischerweise werden Double-Buffering Techniken verwendet: Die Szene wird in einen nicht-sichtbaren Puffer gezeichnet. Dieser Puffer wird danach auf dem Bildschirm kopiert. Dies vermeidet Flackern da Zwischenschritte beim Bildaufbau nicht gezeigt werden. Innerhalb des Kontexts können rechteckige Bereiche (Viewports) zum Zeichnen ausgewählt werden. Wintersemester 2009/10 5 / 34

Android OpenGL-Kontext Klasse GLSurfaceView.Renderer implementieren! public abstract interface Renderer { /** Wird aufgerufen wenn ein neuer Zeichenbereich * erzeugt wurde */ void onsurfacecreated(gl10 gl, EGLConfig config); /** Wird aufgerufen wenn sich der Zeichenbereich * geaendert hat */ void onsurfacechanged(gl10 gl, int width, int height); /** Wird aufgerufen wenn ein neues Bild gezeichnet * werden soll */ void ondrawframe(gl10 gl); } Wintersemester 2009/10 6 / 34

J2ME OpenGL-Kontext siehe apps/openglesdemo im Java Wireless Toolkit. Wintersemester 2009/10 7 / 34

3D-Szenen und Geometrie +z +y +x 3D-Geometrie wird in einem kartesischen Koordinatensystem angegeben. Das einzige Primitiv das gezeichnet werden kann ist das Dreieck. Würfel, Kugeln, etc. werden stets aus Dreiecken zusammengesetzt. Wintersemester 2009/10 8 / 34

3D-Projektion Wie bringt man 3-dimensionale Geometrie auf einen 2-dimensionalen Bildschirm? Perspektivische Projektion: Sehstrahlen gehen von einem Punkt (Kamera/Auge) aus. Kurz vor diesem befindet sich die 2-dimensionale Bildfläche. Wintersemester 2009/10 9 / 34

Projektion in OpenGL Die Projektion in OpenGL wird durch die PROJECTION-Matrix bestimmt. Diese setzt man am einfachsten mit glfrustum: glfrustumf(left, right, bottom, top, znear, zfar) Beispiel: glmatrixmode(gl_projection); glloadidentity(); float ratio = screen_width / screen_height; glfrustumf(-ratio, ratio, -1, 1, 1, 10); Wintersemester 2009/10 10 / 34

OpenGL Zustand OpenGL ist eine Zustandsmaschine. Tyische Modi die man zu Begin des Programs setzt: glenable(gl_depth_test); // glenable(gl_cull_face); // glenable(gl_blend); // glshademodel(gl_smooth); // glenable(gl_texture_2d); glhint(gl_perspective_correction_hint, GL_FASTEST); Wintersemester 2009/10 11 / 34

OpenGL Viewport Initialisieren Der Viewport muss am Anfang gesetzt werden und jedes Mal wenn sich die Größe des Fensters/Bildschirms ändert. /* viewport consists of the whole screen */ glviewport(0, 0, width, height); /* setup projection matrix */ glmatrixmode(gl_projection); glloadidentity(); float ratio = screen_width / screen_height; glfrustumf(-ratio, ratio, -1, 1, 1, 10); Wintersemester 2009/10 12 / 34

Typischer Ablauf Kontext und Viewport initialisieren Projektion einstellen Wiederhole glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT) Kameratransformation setzen Objekte zeichnen (glflush()) Wintersemester 2009/10 13 / 34

Transformationen sind Matrizen Typische Transformationen für 3D-Geometrie sind: Verschieben (gltranslatef(x, y, z)) Skalieren (glscalef(x, y, z)) Rotieren (glrotatef(angle_degree, x, y, z)) Dies sind alles lineare Abbildungen und lassen sich deshalb einheitlich in einer Matrix repräsentieren. Mehrere Transformationen lassen sich kombinieren indem man ihre entsprechenden Matrizen multipliziert! translate(scale(v)) = M translate M scale v Wintersemester 2009/10 14 / 34

Grafik Pipeline x y z Modelview Matrix Projection Matrix Persp. Division + Viewport Transformation Objekt Koordinate Augen Koordinate Clipping Koordinate Fenster Koordinate Wintersemester 2009/10 15 / 34

Matrixmanipulation Matrix wählen: glmatrixmode(matrix) matrix ist GL_MODELVIEW, GL_PROJECTION oder GL_TEXTURE Einheitsmatrix setzen: glloadidentity() Mit Rotationsmatrix multiplizieren: glrotatef(angle, x, y, z) Mit Skalierungsmatrix multiplizieren: glscalef(x, y, z) Mit Verschiebematrix multiplizieren: gltransformf(x, y, z) Matrixstack (siehe nächste Folien): glpushmatrix(), glpopmatrix() Weitere Funktionen: glloadmatrix, glmultmatrix, glget Wintersemester 2009/10 16 / 34

Beispiel 1: Kamera bewegen und um Ursprung rotieren /* ModelviewMatrix neu setzen */ glmatrixmode(gl_modelview); glloadidentity(); /* Kamera 5 Einheiten vom Ursprung wegbewegen */ gltranslatef(0, 0, -5); /* Um "angle" grad nach rechts um den Ursprung rotieren */ glrotatef(angle, 0, 1, 0); /* Szene Zeichnen */ drawearth(); Live Demo Wintersemester 2009/10 17 / 34

Beispiel 2: Erde umkreist Sonne glmatrixmode(gl_modelview); glloadidentity(); gltranslatef(0, 0, -5); drawsun(); glrotatef(angle, 0, 1, 0); gltranslatef(2f, 0, 0); glscalef(0.6f, 0.6f, 0.6f); drawearth(); Live Demo Wintersemester 2009/10 18 / 34

Der Matrixstack Häufig will man Transformationen nur auf einen Teil der Szene anwenden. Beispielsweise will man die letzten glrotatef, gltranslatef, glscalef nur auf die Erde Anwenden, nicht auf danach gezeichnete weitere Planeten. Dafür kann man Matrizen auf den OpenGL Matrixstack legen: glpushmatrix() legt aktuelle Matrix auf Matrixstack glpopmatrix() läd oberste Matrix vom Matrixstack Wintersemester 2009/10 19 / 34

Beispiel3: Sonne, Erde und Mars /*... */ drawsun(); glpushmatrix(); glrotatef(angle, 0, 1, 0); gltranslatef(2f, 0, 0); glscalef(0.6f, 0.6f, 0.6f); drawearth(); glpopmatrix(); glpushmatrix(); glrotatef(angle*1.6f, 0, 1, 0); gltranslatef(0, 0, 3f); glscalef(0.3f, 0.3f, 0.3f); drawmars(); glpopmatrix(); Live Demo Wintersemester 2009/10 20 / 34

Typischer Ablauf 2 Kontext und Viewport initialisieren Projektion einstellen Wiederhole glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT) Kameratransformation setzen Für alle Objekte (auch rekursiv) glpushmatrix() Objekttransformation setzen Objekt zeichnen glpopmatrix() (glflush()) Wintersemester 2009/10 21 / 34

Geometrie erzeugen Um Dreiecke zu zeichnen muss man 2 Dinge angeben: Eine Liste mit Punkten (Vertices) Eine Liste die angibt welche Punkte zu dreiecken verbunden werden Implementierung: Erzeuge float[] Reihung. Jeweils 3 aufeinanderfolgende Elemente ergeben einen (x, y, z) Vektor (genannt VertexArray). Erzeuge short[] Reihung. Elemente sind Indizes ins VertexArray (genannt IndexBuffer). 1 Zeichnen: glenableclientstate(gl_vertex_array); glvertexpointer(3, GL_FLOAT, 0, vertexarray); gldrawelements(gl_triangles, n_triangles, GL_UNSIGNED_SHORT, indexbuffer); 1 Die Indizes beziehen sich auf Punkte nicht auf Einträge im VertexArray i VertexArray = i 3 Wintersemester 2009/10 22 / 34

Puffer in Android OpenGL ist eine Hardwarenahe Bibliothek und benötigt Puffer die unabhängig von der Java Garbage-Collection arbeiten. Abhilfe: private static FloatBuffer makedirectfloatbuffer(float[] array) { int len = array.length (Float.SIZE/8); ByteBuffer storage = ByteBuffer.allocateDirect(len); storage.order(byteorder.nativeorder()); FloatBuffer buffer = storage.asfloatbuffer(); buffer.put(array); buffer.position(0); return buffer; } private static ShortBuffer makedirectshortbuffer(short[] array) { int len = array.length (Short.SIZE/8); ByteBuffer storage = ByteBuffer.allocateDirect(len); storage.order(byteorder.nativeorder()); ShortBuffer buffer = storage.asshortbuffer(); buffer.put(array); buffer.position(0); return buffer; } Wintersemester 2009/10 23 / 34

Beispiel: Rechteck 2 3 0 1 float[] rectvertices = new float[] { 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0 }; rectverticesbuffer = makedirectfloatbuffer(rectvertices); short[] recttriangles = new short[] { 0, 1, 2, 2, 3, 0 }; recttrianglesbuffer = makedirectshortbuffer(recttriangles); Wintersemester 2009/10 24 / 34

Beispiel: Würfel float[] vertices = new float[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; verticesbuffer = makedirectfloatbuffer(vertices); short[] triangles = new short[] { / front / 0, 1, 2, 2, 3, 0, / back / 6, 5, 4, 4, 7, 6, / top / 4, 5, 1, 1, 0, 4, / bottom / 2, 6, 7, 7, 3, 2, / left / 7, 4, 0, 0, 3, 7, / right / 1, 5, 6, 6, 2, 1 }; Wintersemester 2009/10 25 / 34

Farben Farben werden als 4-Tupel angegeben: (rot, grün, blau, alpha) rot, grün, blau werden als Fließkommazahl im Bereich [0, 1.0] angegeben. alpha gibt die Deckkraft der Farbe an (Transparenz möglich). 1.0 ist maximale Deckung; 0.0 unsichtbar (komplett Transparent). OpenGL-Befehle: glcolor4f(red, green, blue, alpha); Setzt aktuelle Farbe; Die Farbe aller folgenden Pixel wird mit aktueller Farbe multipliziert. Eigene Farbe pro Punkt: glenableclientstate(gl_color_array); glcolorpointer(4, GL_FLOAT, 0, colorbuffer); Wintersemester 2009/10 26 / 34

Texture Mapping Projeziere ausschnitt aus Rechteckiger Textur auf ein Dreieck. Die Koordinaten innerhalb der Textur werden mit Vektor (u, v) angegeben. Wintersemester 2009/10 27 / 34

Texture Mapping Beispiel Wintersemester 2009/10 28 / 34

Textur laden - Randbedingungen OpenGL verlangt folgendes bevor Texturen funktionieren: OpenGL schreibt vor, dass die Höhe und Breite der Textur eine Zweierpotenz ist (4, 8, 16,... ). GL_TEXTURE_MIN_FILTER und GL_TEXTURE_MAG_FILTER müssen gesetzt werden. Achtung: Der Android Software Emulator überprüft diese Dinge nicht und funktioniert trotzdem. Auf echten Handys läuft die Software dann aber nicht. Wintersemester 2009/10 29 / 34

Textur laden (Android Code) / Erzeugt OpenGL Textur aus einer Bitmap @return TexturID / private int loadgltexture(gl10 gl, Bitmap bitmap) { int[] tids = new int[1]; gl.glenable(gl10.gl_texture_2d); gl.glgentextures(1, tids, 0); gl.glbindtexture(gl10.gl_texture_2d, tids[0]); / check for power of 2 sizes / assert (bitmap.getwidth() & (bitmap.getwidth() 1)) == 0; assert (bitmap.getheight() & (bitmap.getheight() 1)) == 0; GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); gl.gltexparameterx(gl10.gl_texture_2d, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.gltexparameterx(gl10.gl_texture_2d, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); return tids[0]; } Wintersemester 2009/10 30 / 34

Mit Textur zeichnen Sicherstellen dass glenable(gl_texture_2d) aktiviert ist. Zusätzlichen Puffer für Texturkoordinaten anlegen. Für jeden Punkt (Vertex) genau eine Texturkoordinate. Puffer mit Koordinaten vor dem Zeichnen angeben. glenableclientstate(gl_texture_coord_array); gltexcoordpointer(2, GL_FLOAT, 0, coordbuffer); Textur auswählen ( binden ): glbindtexture(gl_texture_2d, texid) wie gewohnt mit gldrawelements(...) zeichnen. Wintersemester 2009/10 31 / 34

Typische Zeichenroutine / client State setzen (koennte man auch global fuers ganze Programm machen / glenableclientstate(gl_vertex_array); glenableclientstate(gl_texture_coord_array); gltexcoordpointer(2, GL_FLOAT, textureid); glvertexpointer(3, GL_FLOAT, 0, vertexbuffer); gldrawelements(gl_triangles, n_triangles_vertices, GL_UNSIGNED_SHORT, indicesbuffer); siehe auch: drawearth(), drawsphere() im Beispiel. Wintersemester 2009/10 32 / 34

Fehlerflag abfragen private static String glerrortostring(int error) { switch (error) { case GL10.GL_NO_ERROR: return "no error"; case GL10.GL_INVALID_ENUM: return "invalid enum"; case GL10.GL_INVALID_OPERATION: return "invalid operation"; case GL10.GL_INVALID_VALUE: return "invalid value"; case GL10.GL_STACK_OVERFLOW: return "stack overflow"; case GL10.GL_STACK_UNDERFLOW: return "stack underflow"; case GL10.GL_OUT_OF_MEMORY: return "out of memory"; default: return "unknown error"; } } private static void checkforglerrors(gl10 gl) { int error = gl.glgeterror(); if (error!= GL10.GL_NO_ERROR) { throw new RuntimeException("OpenGL Error: " + glerrortostring(erro } } Jetzt einfach ab und zu checkforglerrors() aufrufen. Wintersemester 2009/10 33 / 34

Literatur Khronos Group. OpenGL ES reference pages. http://www.khronos.org/opengles/sdk/docs/man/. NeHe Productions. OpenGL tutorials. http://nehe.gamedev.net/. Dave Shreiner, Mason Woo, and Jackie Neider. OpenGL(R) Programming Guide: The Official Guide to Learning OpenGL, Version 1.2. Addison-Wesley Longman, Amsterdam, 6th edition, August 2007. Wintersemester 2009/10 34 / 34