Rendering Rechteck Textur mit GLSL

9

Ich habe eine Klasse erstellt, die Videoframes (auf Mac) in ein benutzerdefiniertes Framebuffer-Objekt rendert. Als Eingabe habe ich eine YUV-Textur, und ich habe erfolgreich einen Fragment-Shader erstellt, der als Eingabe 3 Rechteck-Texturen verwendet (eine für Y-, U- und V-Ebenen, deren Daten von glTexSubImage2D mit GL_TEXTURE_RECTANGLE_ARB, GL_LUMINANCE und GL_UNSIGNED_BYTE hochgeladen werden) Vor dem Rendern setzte ich die aktiven Texturen auf drei verschiedene Textureinheiten (0, 1 und 2) und bettete für jede eine Textur, und aus Gründen der Performance habe ich GL_APPLE_client_storage und GL_APPLE_texture_range verwendet. Dann habe ich es gerendert mit glUseProgram (myProg), glBegin (GL_QUADS) ... glEnd ().

Das hat gut funktioniert, und ich habe das erwartete Ergebnis (abgesehen von einem flackernden Effekt, was ich mit der Tatsache zu tun habe, dass ich zwei verschiedene GL-Kontexte in zwei verschiedenen Threads verwendete, und ich vermute, dass sie sich gegenseitig in die Quere kommen irgendwann [das ist Thema für eine andere Frage später]). Jedenfalls habe ich beschlossen, meinen Code weiter zu verbessern, indem ich auch einen Vertex-Shader hinzufüge, so dass ich glBegin / glEnd überspringen kann - was ich gelesen habe, ist veraltet und sollte sowieso vermieden werden.

Als nächsten Schritt habe ich zwei Pufferobjekte erstellt, eins für die Scheitelpunkte und eins für die Texturkoordinaten:

%Vor%

Nach dem Laden der Shader versuche ich dann die Positionen der Attribute im Vertex-Shader zu finden:

%Vor%

was mir 0 für texCoord und 1 für die Position gibt, was gut aussieht.

Nachdem ich die Attribute bekommen habe, rufe ich auch

an %Vor%

(mache ich das nur einmal, oder muss es vor jedem glVertexAttribPointer und glDrawArrays gemacht werden? Muss es pro Textureinheit gemacht werden? oder während mein Shader mit glProgram aktiviert ist? Oder kann ich es einfach überall machen ?)

Danach habe ich den Rendering-Code geändert, um glBegin / glEnd zu ersetzen:

%Vor%

Aber seit ich den Code geändert habe, bekomme ich als Ergebnis immer nur einen schwarzen Bildschirm. Also ich vermisse einige einfache Schritte, vielleicht etwas glEnable / glDisable oder setze einige Dinge richtig - aber aber wie ich schon sagte bin ich neu, also habe ich keine Ahnung. Zu Ihrer Information, hier ist der Vertex-Shader:

%Vor%

Meine Vermutung ist, dass mir hier etwas offensichtlich fehlt oder ich habe noch nicht genug Verständnis für die laufenden Prozesse hier. Ich habe auch versucht, OpenGLShaderBuilder zu verwenden, was mir half, den ursprünglichen Code für den Fragment-Shader richtig zu bekommen (deshalb habe ich ihn hier nicht gepostet), aber seit ich den Vertex-Shader hinzugefügt habe, gibt er mir auch keine Ausgabe wie könnte es wissen, wie man die Ausgabe erzeugt, wenn es die position / texCoord Attribute sowieso nicht kennt?)

    
Bjoern 18.05.2012, 07:41
quelle

1 Antwort

2

Ich habe nicht jede Zeile genau studiert, aber ich denke, Ihre Logik ist größtenteils richtig. Was ich vermisse, ist glEnableVertexAttribArray . Sie müssen beide Vertex-Attribute vor dem Aufruf von glDrawArrays aktivieren.

    
Tim 18.05.2012, 07:45
quelle

Tags und Links