2015-09-29 6 views
5

Ich lerne OpenGL zu verwenden und bin überrascht, dass die Farbe immer als eine vec4 Struktur definiert ist, die aus 4 einzelnen Präzision float In-Punkt-Nummern besteht. Ich bin überrascht, weil, wenn die Größe des Speichers an den Grafikspeicher zu kopieren ist ein Anliegen (das ist, warum Indizes mit Vertex-Shader vorhanden ist) die Größe jeder Farbe ist:Warum verwendet OpenGL 4 Floats, um die Farbe normal zu definieren?

4 x 32 = 128 bits or 16 bytes 

wenn alles, was ein definieren, benötigt wird, 32 Bit Farbe ist 32 Bit (4 Byte)! Warum definieren Sie ARGB Farbkanäle nicht als Bytes?

+3

OpenGL hat auch 'glColor3ub', die Bytes für jede Komponente verwendet. – Dai

+0

128 Bits sind 16 Bytes, nicht 32. –

+0

computergraphics.stackexchange. . . – imallett

Antwort

5

Farbe scheint als vec4 Struktur, bestehend aus 4 mit einfacher Genauigkeit Gleitkommazahlen

Zuerst immer definiert werden: es ist nicht. Wenn Sie eine Textur laden, versuchen Sie es mit einem der großen Formate als internes Format. Zum Beispiel ist GL_RGBA8 ein normalisiertes Format mit 8 Bits pro Kanal. GL_RGBA16F ist ein 16-Bit Gleitkommaformat pro Kanal. Es gibt viele.

Die Vielfalt ist aus Gedächtnisgründen vorgesehen, wie Sie sagen, aber auch für algorithmische Entscheidungen. Z.B. Sie können Texturansichten verwenden, um eine ganzzahlige Einkanal-Textur als 4-Byte-Vierkanaltextur zu lesen. Ein weiteres Beispiel: Sie können einen Tiefpass-Tiefendatenpuffer als atomaren Ganzzahlpuffer für das Tief-Peeling mit Single-Pass-Tiefe unter Verwendung von 64-Bit-Atomics anzeigen.


Wie für Vertex-Daten haben Sie wieder Ihre Wahl. Die API bietet verschiedene Schritte und Größen für Ihre Daten. Intern wird das Format jedoch fast immer in Fließkommawerte konvertiert, bevor der Shader ausgeführt wird.

Warum? Weil alle Daten ohnehin von einem Fließkomma-Prozessor verarbeitet werden. Alles, was Sie tun - Überblendung, Texturmodulation, BRDF-Modulation usw. - erfolgt in Gleitkomma. Das ist in Ordnung; Das Rendern wird normalerweise durch Fragment-Shader-Textur-Zugriffe gebunden, so dass die Fließkomma-Berechnung vergleichsweise frei ist.

+0

macht Sinn, würde nicht 'byte' in mathematischen Berechnungen verwenden wollen – markmnl

Verwandte Themen