- glUniformBlockBinding(Shader.ID, glGetUniformBlockIndex(Shader.ID, UniformName), 0);
DGL https://delphigl.com/forum/ |
|
UnifomBlockObject https://delphigl.com/forum/viewtopic.php?f=20&t=11450 |
Seite 1 von 4 |
Autor: | mathias [ Di Okt 27, 2015 20:13 ] |
Betreff des Beitrags: | UnifomBlockObject |
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. Code:
In InitScene habe ich folgenden Aufruf: Code:
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. Shader.ID zeigt auf die ProgrammID des Shaders. So wie es aussieht, haben die dort ein ähnliches Problem; http://stackoverflow.com/questions/9155 ... rm-buffers |
Autor: | glAwesome [ Mi Okt 28, 2015 11:38 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
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. |
Autor: | mathias [ Mi Okt 28, 2015 15:01 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
Wen es eine andere Lösung gibt, würde ich es anders machen. |
Autor: | Sascha Willems [ Mi Okt 28, 2015 18:44 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
Code:
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 Bindungen müssen zum Shader passen : Code:
|
Autor: | mathias [ Mi Okt 28, 2015 19:51 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
Zitat: Die Bindungen müssen zum Shader passen : Dies geht leider nicht, da wird Version 4.2 verlangt, aber ich habe nur 3.3. Code:
Aber für was sollte die BindingNr gut sein ? Für was ist dann glGetUniformBlockIndex gut ? |
Autor: | Sascha Willems [ Mi Okt 28, 2015 21:02 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
Dann leg die Binding Points selbst fest : Code:
Wichtig ist dass jeder Block sein eigenes Binding hat. |
Autor: | mathias [ Mi Okt 28, 2015 21:04 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
So wie es aussieht, habe ich es jetzt zum laufen gebracht. Code:
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:
Und so kann ich jetzt zu Laufzeit die werte ändern: Code:
|
Autor: | mathias [ Mi Okt 28, 2015 21:21 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
Zitat: Dann leg die Binding Points selbst fest : Habe ich jetzt eingebaut, so wie ich es gemacht sieht obiges Post, geht. Danke für die Infos. Wäre es noch zu empfehlen ein std140 in den Shader zu schreiben ? Code:
|
Autor: | Sascha Willems [ Mi Okt 28, 2015 21:25 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
mathias hat geschrieben: Wäre es noch zu empfehlen ein std140 in den Shader zu schreiben ? Code:
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. Details dazu : https://www.opengl.org/wiki/Interface_B ... ory_layout |
Autor: | mathias [ Mi Okt 28, 2015 21:28 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
Zitat: was sehr praktisch ist wenn man Structs verwendet die dann in deiner Anwendung das selbe Layout haben wie im Shader. Das wäre eigentlich das Ziel, sonst würde ist nicht viel Sinn machen. |
Autor: | glAwesome [ Do Okt 29, 2015 16:19 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
mathias hat geschrieben: Code:
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. |
Autor: | mathias [ Do Okt 29, 2015 16:56 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
Meinst du so sei es besser ? Code:
|
Autor: | glAwesome [ Fr Okt 30, 2015 11:27 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
Ja, so meinte ich das mit glBufferSubData. Bei glBindBufferBase bin ich mir unsicher. Müsste es nicht reichen, das nur einmal in Create aufzurufen? |
Autor: | mathias [ So Nov 01, 2015 17:40 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
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. Code:
|
Autor: | mathias [ So Nov 08, 2015 16:49 ] |
Betreff des Beitrags: | Re: UnifomBlockObject |
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 ? |
Seite 1 von 4 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |