Registriert: Sa Mär 14, 2009 17:48 Beiträge: 99
Programmiersprache: D, Java, C++
Hi, Ich versuche momentan alles möglichst OpenGL 3.2 kompatibel zu halten, damit ich sobald vernünftige Bindings für meine bevorzugte Sprache vorhanden sind umsteigen kann, jedoch frage ich mich gerade wie ich vernünftig PostProcessing Effekte benutzen kann, im Moment zeichne ich dazu ein Fullscreen Quad mit der jeweiligen Textur und binde meine Shader, aber da es in OpenGL 3.2 ja scheinbar nichtmehr so simpel ist ein Fullscreen Quad zu zeichnen (Gut, ein VBO und 2 Triangles sind nun nicht sonderlich kompliziert, aber reichlich unperformant) frage ich mich wie ich das möglichst Performant auf die Reihe krieg, hat da jemand Ideen?
Ich arbeite seit über einem halben Jahr mit reinem OpenGL3.x, aber für so einen Fall ist mir auch noch keine bessere Möglichkeit untergekommen.
Wenn man allerdings bedenkt das dieses Quad (2x Triangle), pro PostProcessing Effekt nur einmal gezeichnet werden muss, denke ich das sich der negative Einfluss auf die Performance nicht sonderlich groß sein wird.
Registriert: Sa Mär 14, 2009 17:48 Beiträge: 99
Programmiersprache: D, Java, C++
Coolcat hat geschrieben:
Was spricht gegen ein VertexArray? Das sollte es in OpenGL 3 noch geben.
AFAIK gibt es VertexArrays nurnoch in Form von "VertexArrayBuffers", diese bündeln mehrere VertexBuffer Bindings und States (Attribut Pointer und solche dinge) in einem einzigen Buffer, damit man nurnoch einen Buffer binden muss um OpenGL Funktionsaufrufe zu sparen, aber Vertex Arrays in form des "Immediate" Rendering gibt es nichtmehr. Wenn ich falsch liege bitte ich darum mich zu korrigieren.
Registriert: So Okt 21, 2007 14:16 Beiträge: 123
Programmiersprache: Delphi
Hallo,
auch wenn das Thema etwas älter ist: Ich stehe jetzt vor demselben Problem und habe versucht, die von Coolcat verlinkte Methode mittels Vertex Arrays zu realisieren. Ich habe nur das Problem, dass ich beim Aufruf von glVertexAttribPointer immer eine InvalidOperation bekomme. Mein Codeausschnitt sieht so aus:
ich habe glDrawArrays auskommentiert, da der Fehler schon vorher passiert. Versuchsweise habe ich glGet (GL_max_vertex_attribs) versucht, das Ergebnis ist 16. Ich habe nur alte Demos mit OpenGL 2.1 gefunden, in denen noch der Befehl glEnableClientState verwendet wird, dies führt aber bei OGL 3.2 auch zu einer InvalidOperation. Hat jemand noch eine Idee, was da falsch ist? Für Hilfe wäre ich sehr dankbar.
Registriert: Do Jun 28, 2007 17:58 Beiträge: 193
Programmiersprache: Pascal, C
In meiner kompletten Andorra 2D Bibliothek verwende ich im DirectX9c ausschließlich VBOs, da dies die bevorzugte Methode ist. Probleme sind mir damit noch keine unter gekommen - im Gegenteil. Mit den VBOs bin ich durchweg schneller als bei den von mir bei OpenGL verwendeten Vertex Arrays und das, obwohl bei einer 2D-Engine nicht viel mehr als lediglich Quads gezeichnet werden.
Registriert: So Okt 21, 2007 14:16 Beiträge: 123
Programmiersprache: Delphi
Hallo,
habs nochmal mit ByteBool(GL_FALSE) getestet, da liegt das Problem aber nicht (getestet) und ist auch eher unwahrscheinlich, da in Software generell der Wert "FALSE" so gut wie immer 0 ist. Da ich OpenGL 3.2 benutze, kann das ganze auch nicht zwischen glBegin/glEnd sein. Ich habe mich entschieden, vorerst ein Vertex Array Object zu verwenden, obwohl ich nach wie vor an einer Lösung interessiert wäre.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Invalid Operation liegt nicht an irgendwelchen Werten. Das ist dann immer Invalid Value. Zu mindest dabei sind sie sehr konsequent. Invalid Operation deutet darauf hin, dass du etwas aufrufst was du dort nicht aufrufen darfst. Bei den Definionen der Erweiterungen gibt es immer einen Abschnitt Errors der eine Auflistung enthält wann welche Fehlercodes gesetzt werden.
GL_ARB_vertex_shader hat geschrieben:
The error INVALID_OPERATION is generated by any command accessing texture coordinate processing state if the texture unit number corresponding to the current value of ACTIVE_TEXTURE is greater than or equal to the implementation-dependent constant MAX_TEXTURE_COORDS_ARB.
The error INVALID_OPERATION is generated by any command accessing texture image processing state if the texture unit number corresponding to the current value of ACTIVE_TEXTURE is greater than or equal to the implementation-dependent constant MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB.
The error INVALID_OPERATION is generated by GetActiveAttribARB if <programObj> is not of type PROGRAM_OBJECT_ARB.
The error INVALID_OPERATION is generated by GetAttribLocationARB if <programObj> is not of type PROGRAM_OBJECT_ARB or if <programObj> has not been linked successfully.
The error INVALID_OPERATION is generated by BindAttribLocationARB if <name> starts with the reserved "gl_" prefix.
The error INVALID_OPERATION is generated by BindAttribLocationARB if <programObj> is not of type PROGRAM_OBJECT_ARB.
The error INVALID_OPERATION is generated by GetObjectParameter{if}vARB if <pname> is OBJECT_ACTIVE_ATTRIBUTES_ARB or OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB and <obj> is not of type PROGRAM_OBJECT_ARB.
The error INVALID_OPERATION is generated by GetObjectParameter{if}vARB if <pname> is OBJECT_SUBTYPE_ARB and <obj> is not of type SHADER_OBJECT_ARB.
The error INVALID_OPERATION is generated by GetVertexAttrib*ARB if <index> is zero and <pname> is CURRENT_VERTEX_ATTRIB_ARB.
Laut Spec kann VertexAttribPointer nur Invalid Values generieren. Deswegen frage ich einfach mal so. Bist du wirklich sicher, dass der Fehler genau da liegt. Ansonsten irritiert mich, dass du einen Pointer direkt übergibst. Laut meinen Wissen soll doch mit gl3 alles in einem VBO liegen. Entsprechend müsstest du dort ein Offset innerhalb des VBOs angeben.
Registriert: So Okt 21, 2007 14:16 Beiträge: 123
Programmiersprache: Delphi
Zitat:
The commands void VertexAttribPointer() [...] describe the locations and organizations of these arrays.
Zitat:
An INVALID_OPERATION error is generated if any of the *Pointer commands specifying the location and organization of vertex array data are called while zero is bound to the ARRAY_BUFFER buffer object binding point (see section 2.9.6), and the pointer argument is not NULL.
Es sieht so aus, als ob die Methode nicht der richtige Ansatz ist. Ich denke, ich verwende meine VBOs weiter.
Mitglieder in diesem Forum: 0 Mitglieder und 93 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.