Genaue Kontrolle über Textur-Bits in GLSL

9

Ich versuche ein Octree-Traversalschema mit OpenGL und GLSL zu implementieren und möchte die Daten in Texturen behalten. Zwar gibt es eine große Auswahl an Formaten für die Texturdaten (Floats und Integer unterschiedlicher Größe), aber ich habe Probleme herauszufinden, ob es eine Möglichkeit gibt, die Bits präziser zu steuern und so eine größere Effizienz und Speicherkapazität zu erreichen. Dies könnte ein generelles Problem sein, das nicht nur auf OpenGL und GLSL zutrifft.

Als einfaches Spielzeugbeispiel sagen wir, dass ich ein Texel mit einer 16-Bit-Ganzzahl habe. Ich möchte zwei boolesche Werte von jeweils 1 Bit, einen 10-Bit-Integer-Wert und dann einen 4-Bit-Integer-Wert in dieses Texel codieren. Gibt es eine Technik, um dies beim Erstellen der Textur zu kodieren, und dann diese Komponenten beim Abtasten der Textur mit einem GLSL-Shader zu dekodieren?

Edit: Sieht so aus, als ob ich tatsächlich nach Bit Manipulationstechniken suche. Da sie unterstützt zu sein scheinen, sollte es mir nach einigen Recherchen gut gehen.

    
Victor Sand 19.02.2013, 15:26
quelle

1 Antwort

3

Integer und Bit-Manipulationen innerhalb von GLSL-Shadern werden seit OpenGL 3 unterstützt (daher auf der DX10-Klassen-Hardware vorhanden, wenn das mehr sagt). Sie können also diese Bit-Steuerung selbst im Shader durchführen.

Aber mit Ganzzahlen zu arbeiten ist eine Sache, sie aus der Textur herauszuholen ist eine andere Sache. Die Standard-OpenGL-Texturformate (an denen Sie vielleicht gewöhnt sind) speichern Floats entweder direkt (wie GL_R16F ) oder normalisierte Fixpunktwerte (wie GL_R16 , effektiv ganze Zahlen für die Nicht-Initiierten;)), aber lesen von ihnen (mit texture , texelFetch oder was auch immer) werden Sie Floating-Werte im Shader erhalten, aus denen Sie nicht so einfach oder zuverlässig das ursprüngliche Bitmuster der intern gespeicherten Ganzzahl ableiten können.

Was Sie also wirklich brauchen, ist eine Integer-Textur, die auch OpenGL 3 benötigt (oder vielleicht die GL_EXT_texture_integer -Erweiterung, aber die Hardware, die das unterstützt, wird wahrscheinlich GL3 haben). Für Ihre Textur müssen Sie also ein ganzzahliges internes Format verwenden, wie z. GL_R16UI (für eine 1-Komponenten 16-Bit-Ganzzahl ohne Vorzeichen) im Gegensatz zu den üblichen Festkommaformaten (wie beispielsweise GL_R16 für eine normalisierte [0,1] -Farbe mit 16-Bit-Genauigkeit).

Und dann müssen Sie im Shader einen ganzzahligen Sampler-Typ verwenden, wie z. usampler2D für eine vorzeichenlose Ganzzahl-2D-Textur (und ebenso isampler... für die signierten Varianten), um tatsächlich eine vorzeichenlose Ganzzahl aus Ihren texture - oder texelFetch -Aufrufen zu erhalten:

CPU:

%Vor%

GPU:

%Vor%     
Christian Rau 19.03.2013, 10:05
quelle