Registriert: Mo Feb 15, 2010 18:09 Beiträge: 21
Programmiersprache: C++, Java
Guten Abend! Arbeitet man mit VBOs, so will man natürlich auch direkt VAOs benutzen. Per glEnableVertexAttribArray und anschließen glVertexAttribPointer würde man dann die entsprechenden Arrays an den Shader übergeben. Dafür braucht man jedoch den Index des Attributs im Shader. Das kann man nach dem Linken mit glGetAttribLocation heraus finden. Schön, jetzt habe ich für einen Shader und ein VBO ein VBA zusammen gebastelt.
Nun kommt ein zweiter Shader und schon passt das ganze nicht mehr zusammen? Meine Idee wäre jetzt, dass ich für meine Engine vordefinierte Indizes verwende und das ganze dann mittels glBindAttribLocation regle. Dabei müssten diese Werte dann am besten mit denen von nVidia übereinstimmen, das es dort scheinbar zu Treiberproblem kommt, auch wenn ich nicht ganz verstanden habe, was das Problem ist. (hier, Vertex Attribute Aliasing, Seite 7) Erlaubt nVidia nicht irgendetwas den Index 2 zu zuordnen oder ist ein gl_Normal dann das gleiche, wie das, was man unter Index 2 angegeben hat?
So würde mein VAO einfach die festen Werte zugeordnet bekommen und die ganze Sache läuft für alle Shader? Und was passiert beim Wechsel? Wie muss ich hier verstehen, wie wird da was "gedeichselt"?
Idee der Implementierung wäre dann sowas wie shader->setAttribute(SHADER_ATTRIBUTE_VERTEX, "vertex") Ziel ist es ja, nicht für jede Shader- und Model-Kombination ein eigenes VAO zu erstellen.
Oder gibt es da eine noch bessere Methode? Danke für eure kreativen Vorschläge!
Registriert: Mo Feb 15, 2010 18:09 Beiträge: 21
Programmiersprache: C++, Java
Also ich fasse zusammen. Ich einige mich mit mir selbst auf Indizes für die verschiedenen Attribute. Im shader selbst muss ich dann festlegen welchen index die variable erhält.
Code:
layout(location = 5) in vec3 position;
Und in meinem VAO würde ich dann einfach die Vertexkoordinaten auf 5 setzen?
Das heißt also insbesondere, dass ich mich nicht mehr mit den Namen der Variablen rum ärgern muss? PS: und mit Uniforms geht das ganze auch so? <3
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Ganz genau. Beachte aber, dass layout(location=x) erst seit OpenGL 3.3 für in und out bzw. ab OpenGL 4.3 für uniform funktioniert.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Da er VAOs verwendet die selbst erst mit OpenGL 3.0 eingeführt werden, gehe ich davon aus das er modernes OpenGL benutzt. OpenGL 3.3 sollte es eigentlich überall geben wo es auch OpenGL 3.0 gibt.
Die Sache bei "Uniform" ist in der Tat ein wenig problematisch. Ich persönlich verwende dort "layout" nicht.
Registriert: Mo Feb 15, 2010 18:09 Beiträge: 21
Programmiersprache: C++, Java
Für Uniforms muss ich als trotzdem auf glGetUniformLocation zurück greifen, brauche also letzendlich doch wieder den Variablennamen. Dann kann man ja auch direkt vordefinierte Namen verwenden. Ist zwar irgendwie unschön, aber naja. (glBindUniformLocation scheint es ja nicht zu geben)
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Desmulator hat geschrieben:
Für Uniforms muss ich als trotzdem auf glGetUniformLocation zurück greifen, brauche also letzendlich doch wieder den Variablennamen. Dann kann man ja auch direkt vordefinierte Namen verwenden. Ist zwar irgendwie unschön, aber naja. (glBindUniformLocation scheint es ja nicht zu geben)
Schon mit UBOs und glGetUniformBlockIndex und glUniformBlockBinding probiert?
Das Problem ist viel mehr, dass ich keine Namen vorgeben möchte. Die Variablen werde ich natürlich speichern. Ich habe lieber eine Index fest gelegt als einen Namen. Nachher verbaut man sich mit Groß- und Kleinschreibung und sucht ewig nach dem Fehler. Ein Zahlenwert erscheint mir da irgendwie robuster.
Sascha Willems hat geschrieben:
Code:
layout (std140, binding = 0) uniform uMatrices
{
mat4 proj;
mat4 view;
mat4[64] model;
};
Okay, das sieht interessant aus. Wie nutzt man denn effektiv diese Array? Einfach alle möglichen transformationen an den shader schicken und dann per uniform die entsprechende auswählen?
Okay, das sieht interessant aus. Wie nutzt man denn effektiv diese Array? Einfach alle möglichen transformationen an den shader schicken und dann per uniform die entsprechende auswählen?
Im Prinzip schreibst du die Daten einfach nach einander nach bestimmten Regeln in ein gewöhnliches Buffer Objekt. Das bindest du dann einfach an den Uniform Block im Shader.
Mitglieder in diesem Forum: 0 Mitglieder und 19 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.