Ich habe eine kleine Classe für UBO geschrieben. Wen ich nur ein UBO im Project habe, dann funktioniert das Ganze auch. Erzeuge ich aber ein zweites UBO, dann kommen sie gegenseitig in die Quere.
allUniforms beinhalte diverse Lichtparameter, welche sich auch ändern lassen. scale ist ein Test-wert welcher probehalber in der Matrix etwas verändert. Das Problem ist aber sobald ich die beiden Zeilen mit UBOScale aufrufe, wird das Licht modifiziert, anstelle von scale. Ich denke, das ich in der Classe etwas falsch mache.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Der zweite Parameter von glBindBufferBase muss glaube ich das sein, was glGetUniformBlockIndex zurückgibt (nicht 0).
Edit: Okay, du verwendest glUniformBlockBinding, da weiß ich nicht, ob das noch stimmt. Habe mich selbst erst kürzlich halbwegs in UBOs eingearbeitet.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Dein Binding Point ist immer 0, der muss bei mehreren Block Objekten aber jeweils eindeutig sein. Mit obigem Code benutzen beide UBOs den selben Binding Point, UboScale überschreibt also UboLight.
Die Fehler-Abfrage geht noch nicht, ich habe es von glGetUniformLocation übernommen, dort wird ein glint zurückgeliefert und bei glGetUniformBlockIndex ein gluint. Aber ein gluint kann logischerweise niemals -1 haben.
Im Shader hatte ich auch noch einen kleine Fehler, beim Shader muss es dringend ein struct sein:
Code:
uniform scale{// geht nicht
float s;
};
uniformfloat scale // geht
Und so kann ich jetzt zu Laufzeit die werte ändern:
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Wäre es noch zu empfehlen ein std140 in den Shader zu schreiben ?
Code:
layout(std140) uniform scale{
float s;
};
Wenn es das ist was du willst, dann ja. Bei std140 wird nix wegoptimiert, was sehr praktisch ist wenn man Structs verwendet die dann in deiner Anwendung das selbe Layout haben wie im Shader. Die kann man dann 1:1 hochladen.
Zum updaten von Buffer Objects solltest du aber glBufferSubData verwenden. glBufferData ist nur zum Anlegen des Puffers sinnvoll, weil es neuen Speicher alloziert, statt den alten weiterzuverwenden.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Ja, so meinte ich das mit glBufferSubData. Bei glBindBufferBase bin ich mir unsicher. Müsste es nicht reichen, das nur einmal in Create aufzurufen?
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Hier nochmals der komplette Code meine UBO-Classe. Es funktioniert alles prächtig, solange ich nicht allzu viele UBOs habe. glBufferSubData habe ich versuchsweise mal ausgeklammert, aber das Ergebnis ist das Gleiche.
Irgendwas stimmt mit meinem UBO immer noch nicht. Für kleinere Scenen mit ca. 20 Mesh, funktioniert alles prima. Wen ich mit meinem OBJ-Loader ein Object lade, das sich aus ca. 800 Meshes zusammensetzt, kommt es zur Darstellungsfehler. Mein schwacher Intel-Atom hat sogar mit weniger Elementen Probleme.
Jedes Mesh bekommt einen eigenen Shader. Jeder Shader hat eine Beleuchtungsberechnung, dafür habe ich 2 UBOs eine für Licht, die andere das Material.
Ich habe jedes Mesh in eine Classe gepackt, somit hat jedes Mesh die eigene Beleuchtung-Daten.
Löse ich Ganze mit normalen Uniform-Übergaben, dann läuft alles Fehlerfrei, auch auf dem Atom. Ist evt. die GPUs mit zu vielen UBOs überfordert ?
Mitglieder in diesem Forum: 0 Mitglieder und 3 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.