Ich versuche, ein kleines Float-Array als OpenGL ES 2.0 Texture einzureichen und es zu lesen, um GPGPU besser zu verstehen. Ich versuche dies auf der SGX 530 GPU auf einem TI OMAP3 ARM SoC zu tun.
Ich folge diesem Leitfaden: Linkbeschreibung hier eingeben
Mein Code erstellt und füllt derzeit zwei Float-Arrays und erstellt dann "Pass-Through" -Shader wie folgt:
%Vor%Ich versuche dann, die Textur an die GPU zu senden, sie in einen Framebuffer zu rendern und sie so zurückzulesen:
%Vor%Der Zeichenaufruf sieht so aus:
%Vor%Alles wird kompiliert und ausgeführt, aber meine Datenausgabe sieht so aus:
%Vor%Wie kann ich meinen Text korrekt einreichen und lesen? Danke!
Sie haben eine Reihe von Problemen mit diesem Code. Der Hauptgrund dafür ist, dass ES 2.0 Float-Texturen nicht unterstützt. Speziell:
GL_FLOAT
ist nicht gültig als -Typ -Argument von glTexImage2D()
und glTexSubImage2D()
. Dies muss GL_UNSIGNED_BYTE
oder eine von verschiedenen Optionen GL_UNSIGNED_SHORT_*
sein. glReadPixels()
, die in allen Implementierungen unterstützt wird, ist GL_RGBA
/ GL_UNSIGNED_BYTE
. Es gibt eine zweite von der Implementierung abhängige Kombination, die Sie abfragen können. Ich würde dringend empfehlen, dass Sie einige Dokumentationen überprüfen, bevor Sie blindlings versuchen, Argumente zu übergeben, die für API-Aufrufe möglicherweise gültig sind oder nicht. Die man-Seiten sind ein guter Anfang. Verwenden Sie auch glGetError()
, das bei ungültigen Aufrufen Fehlercodes zurückgibt.
Implementierungen können Erweiterungen unterstützen, die Unterstützung für einige der Funktionen bieten, nach denen Sie suchen. Z.B. OES_texture_float fügt Unterstützung für Float-Texturen hinzu. Sie müssen jedoch prüfen, ob diese Erweiterungen vorhanden sind, bevor Sie sie verwenden.
Der gezeigte Code hat keinen Zeichnungsaufruf, der die Textur verwenden und zum Standardfarbpuffer rendern würde (ein Aufruf wie glDrawElements). Das glReadPixels liest vom Standard Framebuffer. Es kann in OpenGLES2 mit GL_COLOR_ATTACHMENT0 , nicht GL_COLOR_ATTACHMENT0_EXT
geändert werdenFür die überwiegende Mehrheit der TI-Geräte mit Framebuffer-Support / nullws-Unterstützung können Sie den Profiling-Code unter dem folgenden Link verwenden. Der folgende Code testet einige GPGPU-Szenarien, einschließlich Kantenerkennung, Farbkonvertierung und Verwendung von FBO. Siehe Aufrufe zu den Tests 11, 17
BTW, OMAP3 Produktion Chipsätze haben (hatte) SGX530 GPU nicht SGX540. SGX540 / Varianten werden in den OMAP4-Chipsätzen verwendet. Sie hätten sehr viel Glück, wenn Sie eine Produktions-OMAP3-Variante mit SGX540 hätten :) Sie können dies in den Bootlogs oder mit der Debug-Version der PVR-Treiber bestätigen.
Erwähnen Sie auch, welche Karte / Plattform verwendet wird.
Ich versuche dann, die Textur an die GPU zu übermitteln und lese sie so zurück
[...]
Es ist also offensichtlich, dass ich den Puffer nicht von OpenGL "zurückbekomme". Ich würde erwarten, dass es die 1.5 enthält, da ich die Textur mit glReadPixels in mein dataY-Array zurückgelesen habe.
Warum ist es offensichtlich nicht der Backbuffer, den Sie zurücklesen?
Sie geben die Textur niemals in den Farbpuffer zurück, sodass beim Zurücklesen aus dem Farbpuffer die Texturdaten nicht zurückgegeben werden.
Der ursprüngliche Code verwendet Framebuffer-Objekte, um auf die Textur als Farbpuffer zuzugreifen, der in diesem Szenario eine völlig andere Semantik hat (es ist jedoch immer noch ein meist nutzloser Benchmark). Beachten Sie, dass die meisten echten ES2-Geräte auch die Erweiterung GL_OES_framebuffer_object
unterstützen konzeptionell Port das.