Ich spiele ein paar Tricks auf IOS, um einen CPU-GPU-Hybrid-JPEG-Encoder zu bauen. Von meinen Tests mit der CPU glaube ich, dass die Verwendung von GPU zur Durchführung der DCT- und Quantisierungsschritte sinnvoll ist und die Überleistung deutlich steigern sollte (das Komprimieren einer großen Anzahl von JPEGs ist der Flaschenhals in meiner App). Mit Transformationsfeedback sollte dies machbar sein, da ich das verwendet habe, um großartige Ergebnisse beim GPGPU-Computing zu erzielen. Der schwierige Teil ist, wie man die Daten (unsigned int8's von RGBA) effizient erhält.Abrufen von Integer/Byte-Texturdaten "wie es ist" in OpenGL ES 3.0
Wie bereits erwähnt, habe ich OpenGL ES 3.0 zu tun GPGPU-Computing zu verwenden, so dass ich nur Erfahrung mit float-Punkt Texturen, welches Set-up von
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F,WIDTH,HEIGHT,0,GL_RGBA,GL_GLOAT,data);
und von
an den Shadern geliefertAber jetzt sind meine Eingabedaten als ein Array von unsigned Bytes (oder Uint8) gespeichert und ich muss nacheinander 64 von ihnen jedes Mal abrufen. Ich denke, ich kann sie entweder als eine Textur von Bytes ohne Vorzeichen oder effizienter abrufen, da eine Textur von Ganzzahlen ohne Vorzeichen sie dann durch Bitverschiebungen trennt.
Meine Frage ist, wie mache ich eigentlich beide? Genauer gesagt, wie soll ich die internalFormat, Format und Typ für glTexImage2D()? Ich habe viele Kombinationen ausprobiert, aber alle liefern nur 0 in den Shadern (und ich habe die Datenquelle doppelt überprüft, dass sie keine Null sind).
Für ein normales RGBA haben Sie bereits 4 Bytes pro Pixel. Die glTexImage2D() kann verwendet werden, um Byte für Byte abzurufen, da jede der Komponenten vec4 eines dieser Bytes darstellt.Die Werte sind normalisiert, daher müssen Sie sie mit 255 multiplizieren, um einen Ganzzahlwert zu erhalten, der ein Byte darstellt. Sie können also 64 Bytes erhalten, indem Sie 16 (64/4) Aufrufe an glTexImage2D() vornehmen. Oder verpasse ich hier etwas? –
Entschuldigung, nicht die glTexImage2D(). Ich meine das Texel im Shader holen. –
Ja, das war mein Plan-B. Das Problem, das ich mit diesem habe, ist, dass ich nicht weiß, wie man Texturen holt, die als unsigned Bytes gespeichert werden (oder wie man glTexImage2D dafür konfiguriert). Ich würde gerne nach Plan-A springen, wenn möglich, in dem ich eine ganze Zahl (von vier Bytes) anstelle eines einzelnen Bytes als "Pixel" abrufe, was die Anzahl der Aufrufe auf 64/4/4 = 4 reduzieren würde. –