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?
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
@jozxyqk: Es gibt keinen Formatqualifikator für nicht-einheitliche Layouts. – thokra
@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