Das Vulkan-API: Teil 3: Umgang mit 3-D-Daten
()
Über dieses E-Book
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.
Mehr von Alexander Rudolph lesen
Erfolgreiche Spieleentwicklung: Moderne Licht- und Schattenspiele mit OpenGL Bewertung: 0 von 5 Sternen0 BewertungenDas Vulkan-API: Teil 1: Grundlagen und erste Schritte Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenGL, OpenAL und KI Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: Minecraft-Welten erschaffen Teil 2 Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: Minecraft-Welten erschaffen Bewertung: 0 von 5 Sternen0 BewertungenDas Vulkan-API: Teil 2: Wie man ein Framework erstellt und Shader programmiert Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenGL in Space Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: Water-, Terrain- und GUI-Rendering mit OpenGL Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenCL Bewertung: 0 von 5 Sternen0 Bewertungen
Ähnlich wie Das Vulkan-API
Titel in dieser Serie (100)
Zend Framework 2: Für Einsteiger und Umsteiger Bewertung: 0 von 5 Sternen0 BewertungenJavaScript für Eclipse-Entwickler: Orion, RAP und GWT Bewertung: 0 von 5 Sternen0 BewertungenIT Wissensmanagement: Theorie und Praxis Bewertung: 0 von 5 Sternen0 BewertungenHTML5 Security Bewertung: 0 von 5 Sternen0 BewertungenEinstieg in Google Go Bewertung: 0 von 5 Sternen0 BewertungenJavaScript auf dem Server Bewertung: 0 von 5 Sternen0 BewertungenNFC: Near Field Communication für Android-Entwickler Bewertung: 5 von 5 Sternen5/5HTML5 für Mobile Web Bewertung: 0 von 5 Sternen0 BewertungenSkalierbare Softwaresysteme: Design, Betrieb und Optimierungspotenziale Bewertung: 0 von 5 Sternen0 BewertungenUser Experience Testing 3.0: Status Quo, Entwicklung und Trends Bewertung: 0 von 5 Sternen0 BewertungenAlgorithmen: Grundlagen und Implementierung Bewertung: 0 von 5 Sternen0 BewertungenServiceorientierte Architektur: Anforderungen, Konzeption und Praxiserfahrungen Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenGL, OpenAL und KI Bewertung: 0 von 5 Sternen0 BewertungenJava EE Security Bewertung: 0 von 5 Sternen0 BewertungenUX Design für Tablet-Websites: Ein Überblick Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenCL Bewertung: 0 von 5 Sternen0 BewertungenGeolocation mit PHP: Foursquare-API, Google Places & Qype Bewertung: 0 von 5 Sternen0 BewertungenADF - Mobile Apps entwickeln und Swing ablösen: Mobile Apps entwickeln und Swing ablösen Bewertung: 0 von 5 Sternen0 BewertungenÜberzeugende Präsentationen: Konzeption, Technik und Design Bewertung: 0 von 5 Sternen0 BewertungenApache Tapestry: Einstieg in die komponentenorientierte Webentwicklung Bewertung: 0 von 5 Sternen0 BewertungenTFS 2012 Versionskontrolle: Grundlagen, Check-In Policies und Branch-Modelle Bewertung: 0 von 5 Sternen0 BewertungenQualitätssicherung mit JavaScript und PHP Bewertung: 0 von 5 Sternen0 BewertungenMobile Business: Was Entscheider morgen wissen müssen Bewertung: 0 von 5 Sternen0 BewertungenJava 7: Fork-Join-Framework und Phaser Bewertung: 0 von 5 Sternen0 BewertungenNutzeraspekte in Suchmaschinen: Komponenten für eine gelungene Usability-Gestaltung Bewertung: 0 von 5 Sternen0 BewertungenQualität in IT-Architekturen: Strategie und Planung Bewertung: 0 von 5 Sternen0 BewertungenAmazon Web Services für .NET Entwickler Bewertung: 0 von 5 Sternen0 BewertungenSharePoint-Entwicklung für Einsteiger Bewertung: 0 von 5 Sternen0 BewertungenNintex Workflow: Konzepte und Strategien für leistungsfähige SharePoint-Workflows Bewertung: 0 von 5 Sternen0 BewertungenJava EE 7: Ein Ausblick Bewertung: 0 von 5 Sternen0 Bewertungen
Ähnliche E-Books
Datenvisualisierung mit Processing Bewertung: 0 von 5 Sternen0 BewertungenDas Vulkan-API: Teil 2: Wie man ein Framework erstellt und Shader programmiert Bewertung: 0 von 5 Sternen0 BewertungenDatenbanken: Grundlagen und Entwurf Bewertung: 0 von 5 Sternen0 BewertungenStructr: Quelloffenes Daten-CMS auf Neo4j-Basis Bewertung: 0 von 5 Sternen0 BewertungenJava üben mit dem Plotter: Ein Überblick für Studierende und Einsteiger Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenCL Bewertung: 0 von 5 Sternen0 BewertungenApache Kafka Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenGL in Space Bewertung: 0 von 5 Sternen0 BewertungenSoftware Defined Radio-Systeme für die Telemetrie: Aufbau und Funktionsweise von der Antenne bis zum Bit-Ausgang Bewertung: 0 von 5 Sternen0 BewertungenOpenLaszlo: schnell + kompakt Bewertung: 0 von 5 Sternen0 BewertungenCSS3: Die Referenz für Webentwickler Bewertung: 0 von 5 Sternen0 BewertungenSprachenkompendium: Vala, Go und Rust Bewertung: 0 von 5 Sternen0 BewertungenIT-Lösungen auf Basis von SysML und UML: Anwendungsentwicklung mit Eclipse UML Designer und Eclipse Papyrus Bewertung: 0 von 5 Sternen0 BewertungenJavaMoney: Einführung in den JSR-354-Standard Bewertung: 0 von 5 Sternen0 BewertungenAlgorithmen: Grundlagen und Implementierung Bewertung: 0 von 5 Sternen0 BewertungenBig Data: Datenverarbeitung basierend auf MOM und SQL Bewertung: 0 von 5 Sternen0 BewertungenVerallgemeinerte Funktionen: Grundlagen und Anwendungsbeispiele Bewertung: 0 von 5 Sternen0 BewertungenNoSQL-Überblick: Couchbase, Riak, MongoDB Bewertung: 0 von 5 Sternen0 BewertungenNoSQL-Überblick - Elasticsearch und Redis Bewertung: 0 von 5 Sternen0 BewertungenAngular 2: Moderne Frontends für alle Plattformen entwickeln Bewertung: 0 von 5 Sternen0 BewertungenMQL: Eine hierarchische Abfragesprache mit TypeScript erstellen Bewertung: 0 von 5 Sternen0 BewertungenJava FX - Status Quo: Status Quo Bewertung: 0 von 5 Sternen0 BewertungenEinführung in die numerische Strömungsmechanik Bewertung: 1 von 5 Sternen1/5Die nicht zu kurze Kurzeinführung in MATLAB: Erste Schritte in MATLAB Bewertung: 0 von 5 Sternen0 BewertungenProgrammieren in C: Programmieren lernen von Anfang an - Mit vielen Programmierbeispielen - Geeignet zum Selbststudium Bewertung: 0 von 5 Sternen0 BewertungenDSL mit Xtext/Xtend. 4GL mit externem Quellcode Bewertung: 0 von 5 Sternen0 BewertungenNeo4j 2.0: Eine Graphdatenbank für alle Bewertung: 0 von 5 Sternen0 BewertungenJava 8 Streams Bewertung: 0 von 5 Sternen0 BewertungenEclipse meets Java FX Bewertung: 0 von 5 Sternen0 BewertungenRobotik: LEGO MINDSTORMS, NAO und Raspberry Pi Bewertung: 0 von 5 Sternen0 Bewertungen
Softwareentwicklung & -technik für Sie
UML @ Classroom: Eine Einführung in die objektorientierte Modellierung Bewertung: 0 von 5 Sternen0 Bewertungen50 Arten, Nein zu sagen: Effektives Stakeholder-Management für Product Owner Bewertung: 0 von 5 Sternen0 BewertungenKnigge für Softwarearchitekten. Reloaded Bewertung: 0 von 5 Sternen0 BewertungenSketchnotes in der IT: Abstrakte Themen mit Leichtigkeit visualisieren Bewertung: 0 von 5 Sternen0 BewertungenDigital Painting Workbook Bewertung: 0 von 5 Sternen0 BewertungenProgrammieren lernen mit Python 3: Schnelleinstieg für Beginner Bewertung: 0 von 5 Sternen0 BewertungenEinfach Python: Gleich richtig programmieren lernen Bewertung: 0 von 5 Sternen0 BewertungenDigital Paintbook Volume 3 Bewertung: 5 von 5 Sternen5/5KOMA-Script: Eine Sammlung von Klassen und Paketen für LaTeX 2e Bewertung: 0 von 5 Sternen0 BewertungenIT Wissensmanagement: Theorie und Praxis Bewertung: 0 von 5 Sternen0 BewertungenAgiles Produktmanagement mit Scrum: Erfolgreich als Product Owner arbeiten Bewertung: 3 von 5 Sternen3/5Agile Spiele – kurz & gut: Für Agile Coaches und Scrum Master Bewertung: 0 von 5 Sternen0 Bewertungen3D-Drucken für Einsteiger: Ohne Frust 3D-Drucker selbst nutzen Bewertung: 0 von 5 Sternen0 BewertungenEinfach Java: Gleich richtig programmieren lernen Bewertung: 0 von 5 Sternen0 BewertungenBaukunst für Softwarearchitekten: Was Software mit Architektur zu tun hat Bewertung: 0 von 5 Sternen0 BewertungenModellbasiertes Requirements Engineering: Von der Anforderung zum ausführbaren Testfall Bewertung: 0 von 5 Sternen0 BewertungenPrinzipien des Softwaredesigns: Entwurfsstrategien für komplexe Systeme Bewertung: 0 von 5 Sternen0 BewertungenAgiliät und Continuous Delivery Bewertung: 0 von 5 Sternen0 BewertungenEinstieg in Reguläre Ausdrücke Bewertung: 0 von 5 Sternen0 BewertungenProjekt Unicorn: Der Roman. Über Entwickler, Digital Disruption und das Überleben im Datenzeitalter Bewertung: 0 von 5 Sternen0 BewertungenDas große Python3 Workbook: Mit vielen Beispielen und Übungen - Programmieren leicht gemacht! Bewertung: 4 von 5 Sternen4/5Agiles Requirements Engineering und Testen Bewertung: 0 von 5 Sternen0 BewertungenSoftwaredesigndokumente - sinnvoller Einsatz im Projektalltag: Sinnvoller Einsatz im Projektalltag Bewertung: 0 von 5 Sternen0 BewertungenProjektmanagement für Anfänger: Grundlagen, -begriffe und Tools Bewertung: 0 von 5 Sternen0 BewertungenSoftwareentwicklungsprozess: Von der ersten Idee bis zur Installation Bewertung: 0 von 5 Sternen0 BewertungenScrum: Agiles Projektmanagement erfolgreich einsetzen Bewertung: 4 von 5 Sternen4/5Single-Page-Web-Apps: JavaScript im Einsatz: Webseiten erstellen mit AngularJS, Meteor und jQuery Mobile Bewertung: 0 von 5 Sternen0 BewertungenAutomatisiertes Testen: Testautomatisierung mit Geb und ScalaTest Bewertung: 0 von 5 Sternen0 BewertungenGrundlagen und Methoden der Wirtschaftsinformatik: Eine anwendungsorientierte Einführung Bewertung: 0 von 5 Sternen0 Bewertungen
Rezensionen für Das Vulkan-API
0 Bewertungen0 Rezensionen
Buchvorschau
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)