2013-09-06 2 views
6

Ich habe einen Arbeitscode, wo ich vec4 Werte im Shader aus einem Texturpuffer lesen.Wie Texturpuffer verwenden, um eine einzelne Ganzzahl anstelle von vec4 zu lesen

Auf der Client-Seite I erstellen einen Puffer von Verschiebungsvektoren:

vec4 vector1 : vec4(x1, y1, z1, w1); 
vec4 vector2 : vec4(x2, y2, z2, w2); 
vec4 vector3 : vec4(x3, y3, z3, w3); 
.. 

dann schaffe ich eine Eckenpuffer, die vector1, vector2, vector3 enthält ....

Nächstes erstellen I a mit Textur und binden an den obigen Puffer:

glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, bufferID); 

ich wählte GL_RGBA32F weil jeder von x1, y1, z1, w1, etc sind Schwimmer.

im Shader kann ich die einzelnen Vektoren holen mit:

vec4 vector1 = texelFetch(samplerObj, 0); 
vec4 vector2 = texelFetch(samplerObj, 1); 
. 
. 

Aber jetzt mein Verschiebungsvektor nehme kein vec4 ist, sondern eine einzige ganze Zahl ist. d.h

int vector1 = x1; //(int is 32 bit unsigned) 
int vector2 = x2; //(int is 32 bit unsigned) 

kann jemand bitte sagen, was die entsprechende internalFormat sein wird? ist es

glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, bufferID); 

auch, wie ich den Wert mit texelFetch in Shader holen? ist es

int vector1 = texelFetch(samplerObj, 0); 

oder

int vector1 = texelFetch(samplerObj, 0).r ? 

Ich bin verwirrt, weil texelFetch ein Texel zurückgeben soll, die vier Komponenten hat, so muss ich die rote Komponente des Ergebnisses verwenden?

+0

Ich weiß nichts über samplerBuffers, aber für image_load_store muss das interne Format mit der Anweisung layout() übereinstimmen und wenn Sie imageLoad() aufrufen, gibt es immer eine vec4/uivec4/ivec4 usw. Wenn es nicht 4 Komponenten hat Sie ignorieren den Rest und wie Sie sagen, lesen Sie zum Beispiel .r zum Beispiel. Ich spekuliere hier nur, aber vielleicht bedeutet das, dass es besser ist, 16-Byte-Blöcke zu lesen. – jozxyqk

+0

@jozxyqk: Es gibt keinen Formatqualifikator für nicht-einheitliche Layouts. – thokra

+0

@thokra deshalb begann ich mit "Ich weiß nicht über SamplerBuffers". Ich versuche mein Wissen über etwas ähnliches zu geben. Es stimmt nicht genau überein, aber vielleicht gibt es Überschneidungen. TexelFetch indexiert implizit einen usamplerbuffer mit dem internen Format GL_R32UI in Schritten von 4 Bytes und belässt den gba von rgba undefiniert? Ich weiß es nicht. – jozxyqk

Antwort

7

Sie haben bereits das interne Format mit der richtigen Größe für vorzeichenlose Ints angegeben: R32UI. Die zulässigen Formate sind in Tabelle 8.15, in Abschnitt 8.9 der OpenGL 4.4 Core Profile Specification aufgezählt. Bitte beachten Sie, dass der Inhalt des Zwischenspeichers nicht normalisiert bei Verwendung texelFetch auf einer Puffertextur mit dem obigen internen Format ist! Das heißt, Sie erhalten keine Werte im Bereich [0, 1], sondern im Bereich [0, 2^(n-1)], wenn Sie nachschlagen.

Anstelle einer samplerBuffer benötigen Sie auch eine usamplerBuffer.

Wenn Sie ein texelFetch auf einem samplerBuffer mit einem internen Format von R32UI tun, wie in der oben genannten Tabelle angegeben ist, wird eine uvec4 zurück, wo die Komponenten zurückgeführt werden folgende Werte enthalten: uvec4(R, 0, 0, 1).

int vector1 = texelFetch(samplerObj, 0); 

zu einem Fehler bei der Kompilierung führt Dies, weil es keine implizite Konvertierung von uvec4 zu int ist.

int vector1 = texelFetch(samplerObj, 0).r; 

Diese swizzle-Maske wird die R-Komponente der uvec4 Rückzurück durch texelFetch und tun eine implizite Umwandlung von uint zu int. Semantisch macht es auch keinen Sinn, einen Skalarwert Vektor zu benennen. ;)

Was wollen Sie eigentlich so etwas wie

uint displacement = texelFetch(samplerObj, 0).r; 

wo samplerObj ein usamplerBuffer ist.

EDIT: Nur um zu klären, wird immer eine texelFetch gvec4 zurück - wo g wird einfach durch leere (Fest- und Gleitkomma-Formate), i oder u. Wie der Vektor gefüllt wird, hängt vom internen Format der Pufferstruktur ab. Wenn Sie R32F wählen, erhalten Sie ein nicht normalisiertes vec4 (R, 0, 0, 1), für RGBA16 erhalten Sie ein normalisiertes vec4 (R, G, B, A).

Um weitere Verwirrung zu vermeiden: Sie reservieren keinen Speicher für 4-Komponenten-Vektoren, wenn Sie ein Einkomponentenformat verwenden! Sie sind alle nur zu einem gvec4 Lookup erweitert!

+1

Ich glaube, ein großer Teil der Fragen bezieht sich auf die Tatsache, dass texelFetch immer einen 4-Komponenten-Vektor zurückgibt. Wenn Sie texelFetch (samplerObj, 0) .r, das gibt das erste Element. Erzeugt TexelFetch (samplerObj, 1) .r das zweite oder fünfte Element? Ist die Antwort auf diese Frage vom internen Format abhängig? Wenn beispielsweise das interne Format GL_R32UI wäre, wäre es verständlich, wenn es das zweite Element zurückgibt und GL_RGBA32UI das Zurückgeben des fünften unsignierten int bewirkt. Image_load_store benötigt eine explizite Layout-Deklaration, ist diese für einen samplerBuffer ähnlich, aber implizit? – jozxyqk

+0

@jozxyqk: Siehe meine Bearbeitung. Sie erhalten das erste und das zweite Element im Datenspeicher. Das Inkrementieren der Texkoordel um eins ergibt immer das nächste Element, da eine Pufferstruktur im Wesentlichen von einem 1D-Array (dem Datenspeicher des Pufferobjekts) unterstützt wird. – thokra

Verwandte Themen