Das Vulkan-API: Teil 3: Umgang mit 3-D-Daten
()
About this ebook
Dabei erklärt er unter anderem, wie Textur- und Geometriedaten von 3-D-Anwendungen gehandhabt werden und wie man den Datenaustausch zwischen CPU und GPU optimiert. Neben einer umfassenden Beschreibung des richtigen Umgangs mit Grafikdaten wie Bufferobjekten und Texturarrays kommt es dabei auch zu einer ersten Implementierung eines einfachen Frameworks. Schließlich legt er das Fundament, um die genannten Grafikdaten auch innerhalb eines Shader-Programms ansprechen zu können.
Read more from Alexander Rudolph
Das Vulkan-API: Teil 1: Grundlagen und erste Schritte Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: Moderne Licht- und Schattenspiele mit OpenGL Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: OpenGL, OpenAL und KI Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: Minecraft-Welten erschaffen Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: OpenGL in Space Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: Minecraft-Welten erschaffen Teil 2 Rating: 0 out of 5 stars0 ratingsDas Vulkan-API: Teil 2: Wie man ein Framework erstellt und Shader programmiert Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: Water-, Terrain- und GUI-Rendering mit OpenGL Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: OpenCL Rating: 0 out of 5 stars0 ratings
Related to Das Vulkan-API
Titles in the series (100)
Einstieg in Google Go Rating: 0 out of 5 stars0 ratingsServiceorientierte Architektur: Anforderungen, Konzeption und Praxiserfahrungen Rating: 0 out of 5 stars0 ratingsJavaScript für Eclipse-Entwickler: Orion, RAP und GWT Rating: 0 out of 5 stars0 ratingsSharePoint-Entwicklung für Einsteiger Rating: 0 out of 5 stars0 ratingsC++: Kurzportträt einer zeitlosen Sprache Rating: 0 out of 5 stars0 ratingsHTML5 für Mobile Web Rating: 0 out of 5 stars0 ratingsHTML5 Security Rating: 0 out of 5 stars0 ratingsF#: Ein praktischer Einstieg Rating: 0 out of 5 stars0 ratingsSkalierbare Softwaresysteme: Design, Betrieb und Optimierungspotenziale Rating: 0 out of 5 stars0 ratingsJava EE Security Rating: 0 out of 5 stars0 ratingsNFC: Near Field Communication für Android-Entwickler Rating: 5 out of 5 stars5/5Erfolgreiche Spieleentwicklung: OpenGL, OpenAL und KI Rating: 0 out of 5 stars0 ratingsUser Experience Testing 3.0: Status Quo, Entwicklung und Trends Rating: 0 out of 5 stars0 ratingsJavaScript auf dem Server Rating: 0 out of 5 stars0 ratingsIT Wissensmanagement: Theorie und Praxis Rating: 0 out of 5 stars0 ratingsUX Design - Definition und Grundlagen: Definition und Grundlagen Rating: 4 out of 5 stars4/5Algorithmen: Grundlagen und Implementierung Rating: 0 out of 5 stars0 ratingsÜberzeugende Präsentationen: Konzeption, Technik und Design Rating: 0 out of 5 stars0 ratingsWebentwicklung mit dem Play Framework Rating: 0 out of 5 stars0 ratingsTFS 2012 Anforderungsmanagement: Work Items und Prozessvorlagen Rating: 0 out of 5 stars0 ratingsTFS 2012 Versionskontrolle: Grundlagen, Check-In Policies und Branch-Modelle Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: OpenCL Rating: 0 out of 5 stars0 ratingsJava 7: Fork-Join-Framework und Phaser Rating: 0 out of 5 stars0 ratingsMobile Business: Was Entscheider morgen wissen müssen Rating: 0 out of 5 stars0 ratingsAmazon Web Services für .NET Entwickler Rating: 0 out of 5 stars0 ratingsSpring: Vier Perspektiven auf Framework und Ökosystem Rating: 0 out of 5 stars0 ratingsUX Design für Tablet-Websites: Ein Überblick Rating: 0 out of 5 stars0 ratingsBig Data: Executive Briefing Rating: 0 out of 5 stars0 ratingsZend Framework 2: Für Einsteiger und Umsteiger Rating: 0 out of 5 stars0 ratingsBig Data: Technologiegrundlagen Rating: 0 out of 5 stars0 ratings
Related ebooks
Datenvisualisierung mit Processing Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: Minecraft-Welten erschaffen Teil 2 Rating: 0 out of 5 stars0 ratingsDas Vulkan-API: Teil 2: Wie man ein Framework erstellt und Shader programmiert Rating: 0 out of 5 stars0 ratingsDatenbanken: Grundlagen und Entwurf Rating: 0 out of 5 stars0 ratingsStructr: Quelloffenes Daten-CMS auf Neo4j-Basis Rating: 0 out of 5 stars0 ratingsJava üben mit dem Plotter: Ein Überblick für Studierende und Einsteiger Rating: 0 out of 5 stars0 ratingsErfolgreiche Spieleentwicklung: OpenCL Rating: 0 out of 5 stars0 ratingsApache Kafka Rating: 0 out of 5 stars0 ratingsSoftware Defined Radio-Systeme für die Telemetrie: Aufbau und Funktionsweise von der Antenne bis zum Bit-Ausgang Rating: 0 out of 5 stars0 ratingsOpenLaszlo: schnell + kompakt Rating: 0 out of 5 stars0 ratingsCSS3: Die Referenz für Webentwickler Rating: 0 out of 5 stars0 ratingsSprachenkompendium: Vala, Go und Rust Rating: 0 out of 5 stars0 ratingsIT-Lösungen auf Basis von SysML und UML: Anwendungsentwicklung mit Eclipse UML Designer und Eclipse Papyrus Rating: 0 out of 5 stars0 ratingsJavaMoney: Einführung in den JSR-354-Standard Rating: 0 out of 5 stars0 ratingsAlgorithmen: Grundlagen und Implementierung Rating: 0 out of 5 stars0 ratingsBig Data: Datenverarbeitung basierend auf MOM und SQL Rating: 0 out of 5 stars0 ratingsVerallgemeinerte Funktionen: Grundlagen und Anwendungsbeispiele Rating: 0 out of 5 stars0 ratingsNoSQL-Überblick: Couchbase, Riak, MongoDB Rating: 0 out of 5 stars0 ratingsNoSQL-Überblick - Elasticsearch und Redis Rating: 0 out of 5 stars0 ratingsAngular 2: Moderne Frontends für alle Plattformen entwickeln Rating: 0 out of 5 stars0 ratingsMQL: Eine hierarchische Abfragesprache mit TypeScript erstellen Rating: 0 out of 5 stars0 ratingsJava FX - Status Quo: Status Quo Rating: 0 out of 5 stars0 ratingsEinführung in die numerische Strömungsmechanik Rating: 1 out of 5 stars1/5Die nicht zu kurze Kurzeinführung in MATLAB: Erste Schritte in MATLAB Rating: 0 out of 5 stars0 ratingsProgrammieren in C: Programmieren lernen von Anfang an - Mit vielen Programmierbeispielen - Geeignet zum Selbststudium Rating: 0 out of 5 stars0 ratingsDSL mit Xtext/Xtend. 4GL mit externem Quellcode Rating: 0 out of 5 stars0 ratingsNeo4j 2.0: Eine Graphdatenbank für alle Rating: 0 out of 5 stars0 ratingsJava 8 Streams Rating: 0 out of 5 stars0 ratingsEclipse meets Java FX Rating: 0 out of 5 stars0 ratingsRobotik: LEGO MINDSTORMS, NAO und Raspberry Pi Rating: 0 out of 5 stars0 ratings
Software Development & Engineering For You
Design Thinking für Anfänger: Innovation als Faktor für unternehmerischen Erfolg Rating: 0 out of 5 stars0 ratingsLean Production - Grundlagen: Das Prinzip der schlanken Produktion verstehen und in der Praxis anwenden. Schlank zur Wertschöpfung! Rating: 0 out of 5 stars0 ratingsProgrammieren lernen mit Python 3: Schnelleinstieg für Beginner Rating: 0 out of 5 stars0 ratingsSketchnotes in der IT: Abstrakte Themen mit Leichtigkeit visualisieren Rating: 0 out of 5 stars0 ratings3D-Drucken für Einsteiger: Ohne Frust 3D-Drucker selbst nutzen Rating: 0 out of 5 stars0 ratingsDigital Painting Workbook Rating: 0 out of 5 stars0 ratingsProjekt Unicorn: Der Roman. Über Entwickler, Digital Disruption und das Überleben im Datenzeitalter Rating: 0 out of 5 stars0 ratingsProjektmanagement für Anfänger: Grundlagen, -begriffe und Tools Rating: 0 out of 5 stars0 ratingsAgiles Requirements Engineering und Testen Rating: 0 out of 5 stars0 ratingsKanban für Anfänger: Grundlegendes über den Einsatz von Kanban in der Industrie und der Softwareentwicklung Rating: 0 out of 5 stars0 ratingsEinfach Java: Gleich richtig programmieren lernen Rating: 0 out of 5 stars0 ratingsAgiles Coaching als Erfolgsfaktor: Grundlagen des Coachings, um Agile Teams erfolgreich zu managen Rating: 0 out of 5 stars0 ratingsDas große Python3 Workbook: Mit vielen Beispielen und Übungen - Programmieren leicht gemacht! Rating: 4 out of 5 stars4/5KOMA-Script: Eine Sammlung von Klassen und Paketen für LaTeX 2e Rating: 0 out of 5 stars0 ratingsAutomatisiertes Testen: Testautomatisierung mit Geb und ScalaTest Rating: 0 out of 5 stars0 ratingsAgiles Projektmanagement: Scrum für Einsteiger Rating: 0 out of 5 stars0 ratingsAgiles Produktmanagement mit Scrum: Erfolgreich als Product Owner arbeiten Rating: 3 out of 5 stars3/5Softwaredesigndokumente - sinnvoller Einsatz im Projektalltag: Sinnvoller Einsatz im Projektalltag Rating: 0 out of 5 stars0 ratingsBaukunst für Softwarearchitekten: Was Software mit Architektur zu tun hat Rating: 0 out of 5 stars0 ratingsEinfach Python: Gleich richtig programmieren lernen Rating: 0 out of 5 stars0 ratingsGrundlagen und Methoden der Wirtschaftsinformatik: Eine anwendungsorientierte Einführung Rating: 0 out of 5 stars0 ratingsChange Management für Anfänger: Veränderungsprozesse Verstehen und Aktiv Gestalten Rating: 1 out of 5 stars1/5Lean Management für Einsteiger: Erfolgsfaktoren für Lean Management – Lean Leadership & Co. als langfristige Erfolgsgaranten Rating: 0 out of 5 stars0 ratingsDer Design-Thinking-Werkzeugkasten: Eine Methodensammlung für kreative Macher Rating: 0 out of 5 stars0 ratingsBessere Softwareentwicklung mit DevOps Rating: 0 out of 5 stars0 ratingsModellbasiertes Requirements Engineering: Von der Anforderung zum ausführbaren Testfall Rating: 0 out of 5 stars0 ratingsSoftwareentwicklungsprozess: Von der ersten Idee bis zur Installation Rating: 0 out of 5 stars0 ratingsProjektmanagement kurz & gut Rating: 0 out of 5 stars0 ratings
Reviews for Das Vulkan-API
0 ratings0 reviews
Book preview
Das Vulkan-API - Alexander Rudolph
GmbH
1 3-D-Modelle und Texturen
Egal, ob im Rahmen der Programmentwicklung bereits die neue Vulkan-Schnittstelle [1], [2] zum Einsatz kommt oder man noch immer auf das althergebrachte OpenGL vertraut: Funktionen zum Laden einer Textur oder eines 3-D-Modells wird man in beiden Fällen vergeblich suchen. Aus diesem Grund setzen wir uns in diesem Kapitel mit der Frage auseinander, wie sich die für die Darstellung einer 3-D-Szene benötigten Daten unabhängig vom jeweils verwendeten API innerhalb einer Grafikanwendung handhaben lassen.
In den vorangegangenen shortcuts haben wir unser Augenmerk stets auf einen jeweils anderen Aspekt der Vulkan-Programmierung gelegt. Nachdem wir uns zunächst mit den grundlegenden Funktionsprinzipien des neuen Grafik-API auseinandergesetzt haben (Initialisierungsschritte, das Zusammenspiel zwischen einem Command-Buffer und einem Queue-Objekt, Swap Chains, Bufferobjekte und Texturen, Speicherverwaltung, Pipeline- und Renderpass-Objekte, Descriptor Sets, Synchronisierungsmechanismen usw.), drehte sich im folgenden Kapitel schließlich alles um das Multi-Thread-basierte Rendering und Ressourcenmanagement. Im letzten shortcut haben wir darüber hinaus mit dem Entwurf eines einfachen Frameworks (Programmgerüst) [3] für unsere zukünftigen Vulkan-Demoanwendungen begonnen und uns mit den Grundlagen der GLSL-Programmierung (Verwendung von Vertex-, Fragment- sowie Compute-Shader-Programmen) vertraut gemacht. Heute nun werden wir uns mit der Frage auseinandersetzen, wie sich die für die Darstellung einer 3-D-Szene benötigten Modelle und Texturen unabhängig vom jeweils verwendeten Grafik-API innerhalb einer 3-D-Anwendung handhaben lassen. Wie schon gesagt, spielt es in diesem Zusammenhang überhaupt keine Rolle, ob man bereits die neue Vulkan-Schnittstelle verwendet oder weiterhin auf das althergebrachte OpenGL vertraut; Funktionen zum Laden einer Textur oder eines 3-D-Modells sind in beiden Fällen schlichtweg nicht vorhanden.
3-D-Modelle damals und heute
An der Vorgehensweise, wie man ein 3-D-Modell (bzw. die zugrunde liegenden Modellteile) konstruiert und die zugehörigen Geometriedaten abspeichert, hat sich seit den 80er- und 90er-Jahren des letzten Jahrtausends, in denen die ersten 3-D-Spiele wie Elite, Frontier: Elite 2 oder Star Wars: X-Wing das Licht der Welt erblickten, nicht wirklich viel verändert. Auch wenn es zwischen den aktuellen Spieletiteln und den Entwicklungen von einst nur noch sehr wenige Gemeinsamkeiten gibt, setzt sich die Oberfläche eines 3-D-Modells nach wie vor aus einer mehr oder weniger großen Anzahl von Dreiecksflächen zusammen, deren Eckpunkte man als Vertices bezeichnet. Für die Beschreibung und Darstellung eines 3-D-Modells sind nun zwei Arten von Informationen erforderlich, die sich getrennt voneinander abspeichern bzw. im Rahmen einer Grafikanwendung mithilfe von zwei separaten Bufferobjekten verwalten lassen. Innerhalb eines Vertexbuffers werden die Geometriedaten sämtlicher Dreieckseckpunkte relativ zum Modellmittelpunkt gespeichert. Hierzu zählen neben den Vertexpositionen und den Texturkoordinaten auch die für die Beleuchtungsberechnungen unverzichtbaren Normalenvektoren, mit deren Hilfe sich die räumliche Orientierung der einzelnen Dreiecksflächen beschreiben lässt. Die Indizes der an den einzelnen Dreiecksflächen beteiligten Vertices werden hingegen in einem zweiten Array, dem so genannten Indexbuffer, gespeichert. Die Vertices mit den Indices 0, 1, 2 definieren Dreieck 1, die Vertices mit den Indices 3, 4, 5 definieren Dreieck 2 usw. Anhand des in Abbildung 1.1 illustrierten Vertex Quads – hierbei handelt es sich um ein besonders einfaches 3-D-Modell, das häufig im Zusammenhang mit der Billboard-Darstellung zum Einsatz kommt – lässt sich das hinter den Vertex- und Indexbufferobjekten stehende Konzept besonders anschaulich nachvollziehen.
Abbildung 1.1: Texturiertes Vertex Quad
Grafikprimitiven (Primitive Topologies)
Die Interpretation der in einem Indexbuffer gespeicherten Daten als eine Liste von Dreiecken, so geschehen bei dem zuvor betrachteten Vertex Quad, stellt jedoch nur eine von mehreren Deutungsmöglichkeiten dar. Die Zusatzinformation, wie die Indexbufferdaten beim Rendering zu interpretieren sind, wird gemeinhin als Grafikprimitive oder als Primitive Topology bezeichnet und muss im Zuge der Initialisierung einer Rendering-Pipeline (eines VkPipeline-Objekts) festgelegt werden. Welche Primitiven wir in diesem Zusammenhang verwenden können, lässt sich anhand von Listing 1.1 und Abbildung 1.2 nachvollziehen. Während man bei der überwiegenden Mehrzahl der 3-D-Modelle für gewöhnlich auf die Dreieckslisten-Primitive (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST) zurückgreift und in den zugehörigen Indexbufferobjekten jeweils eine Liste der darzustellenden Dreiecke abspeichert, kommt beim Rendering von einzelnen Punkten, Linien oder Linienzügen hingegen die VK_PRIMITIVE_TOPOLOGY_POINT_LIST- bzw. die VK_PRIMITIVE_TOPOLOGY_LINE_LIST-Primitive zum Einsatz.
typedef enum VkPrimitiveTopology {
VK_PRIMITIVE_TOPOLOGY_POINT_LIST = 0,
VK_PRIMITIVE_TOPOLOGY_LINE_LIST = 1,
VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = 2,
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = 3,
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = 4,
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = 5,
[...]
} VkPrimitiveTopology;
Listing 1.1: Grafikprimitiven
Abbildung 1.2: Grafikprimitiven
Vertexformate
Die verwendete Grafikprimitive stellt jedoch nicht die einzige Art von Information dar, die für die korrekte Darstellung eines 3-D-Modells erforderlich ist. Um zu verhindern, dass die in einem Vertex-Shader-Programm durchgeführten Berechnungen zu unerwünschten Ergebnissen führen, müssen innerhalb des hierbei verwendeten Vertexbufferobjekts die Attribute aller an einem 3-D-Modell beteiligten Vertices (Vertexattribute: Texturkoordinaten, Normale, Position usw.) in einer genau definierten Reihenfolge (in einem genau definierten Format) abgespeichert worden sein. Anhand der Listings 1.2 bis 1.6 können Sie sich einen Überblick über die wichtigsten Vertexformate verschaffen, die zum jetzigen Zeitpunkt von unserem Vulkan-Framework unterstützt werden.
Auf das in Listing 1.2 gezeigte CSimpleTexturedScreenSpaceVertex-Format können wir beispielsweise immer dann zurückgreifen, wenn die Vertices wie bei einem Projected Grid (Wasserdarstellung, Terrain-Rendering) oder bei einem Screen-Space-Vertex-Quad (Textausgabe, Darstellung von GUI-Elementen, Hilfsmittel bei der Durchführung von Post-Processing-Berechnungen) bereits im Verlauf der Vertexbufferinitialisierung in den Projektionsraum (Bildraum) transformiert worden sind.
struct CSimpleTexturedScreenSpaceVertex
{
float x, y, z, w;
float tu, tv;
};
Listing 1.2: Vertexformat für bereits in den Bildraum transformierte Vertices
Vertexattribute der CSimpleTexturedScreenSpaceVertex-Struktur:
Bildraumposition
Texturkoordinaten
Das in Listing 1.3 gezeigte CTexturedVertex-Format lässt sich hingegen immer dann verwenden, wenn bei der Darstellung eines 3-D-Modells auf die Durchführung von Echtzeitbeleuchtungsberechnungen verzichtet werden kann.
struct CTexturedVertex
{
float x, y, z;
float tu, tv, textureID;
};
Listing 1.3: Vertexformat für texturierbare, bereits beleuchtete 3-D-Modelle
Vertexattribute der CTexturedVertex-Struktur:
Vertexposition relativ zum Modellmittelpunkt (Modellkoordinaten)
Texturkoordinaten
Index der zu verwendenden Textur
Sofern die Beleuchtung eines 3-D-Modells lediglich im Verlauf der Vertex-Shader-Berechnungen erfolgen soll, bietet sich die Verwendung des in Listing 1.4 gezeigten CTexturedVertexWithNormal-Formats an.
struct CTexturedVertexWithNormal
{
float PosX, PosY, PosZ;
float NormalX, NormalY, NormalZ;
float tu, tv, textureID;
};
Listing 1.4: Vertexformat für texturierbare 3-D-Modelle (vertexbasierte Beleuchtung)
Vertexattribute der CTexturedVertexWithNormal-Struktur:
Vertexposition relativ zum Modellmittelpunkt (Modellkoordinaten)