- // ShowMessage(IntToStr(glGetUniformBlockIndex(Shader.ID, 'Material')));
- ShowMessage(IntToStr(glGetUniformLocation(Shader.ID, 'Material')));
DGL https://delphigl.com/forum/ |
|
UBO struct mehrmals verwendet https://delphigl.com/forum/viewtopic.php?f=20&t=11637 |
Seite 1 von 1 |
Autor: | mathias [ Sa Mär 24, 2018 21:10 ] |
Betreff des Beitrags: | UBO struct mehrmals verwendet |
Ich verwende die struct mit den Lichparametern 3mal. Dieser Code funktioniert, aber das mit den 3 "uniform light? { ... }" gefällt mir nicht. Dazu habe ich mehreres probiert. Einmal oben bei layout, das wird nicht mal kompiliert. Und weiter unten die 3 ausgeklammerten Zeilen, dies wird kompiliert, aber mit glUniformBlockIndex nicht gefunden. Gibt es da eine elegantere Lösung, oder muss ich es sein lassen ? Was ich machen könnte, ich könnte alle 3 Lichter in ein UBO nehmen, aber ich will es erst mal getrennt. Code:
|
Autor: | Sascha Willems [ So Mär 25, 2018 10:54 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
Layout gehört zum Uniform nicht zur Struct (die nicht GLSL spezifisch ist), kann man also z.B. so machen: Code:
Da der Uniform Block anonym ist kann man direkt auf die Member zugreifen. Alternativ, z.B. wenn es mal viele Lichtquellen werden sollten, besser ein SSBO nutzen. UBOs bei NV sind max. 64k und auf AMD afaik seit einiger Zeit eh nur noch als SSBO emuliert (deshalb da keine Limitierung der Größe). |
Autor: | mathias [ So Mär 25, 2018 15:55 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
So wie ich es sehe, muss ich es einzeln machen, wie in meinen Post, wen ich für jede Lichtquelle ein eigener UBO will ? Dein Beispiel könnte ich nehmen, wen ich alle Lichtquellen in ein UBO packen will, dies wäre natürlich effizienter. Zitat: Alternativ, z.B. wenn es mal viele Lichtquellen werden sollten, besser ein SSBO nutzen. UBOs bei NV sind max. 64k und auf AMD afaik seit einiger Zeit eh nur noch als SSBO emuliert (deshalb da keine Limitierung der Größe). Leider wird da mindestens OpenGL 4.3 verlangt, nur kann mein Intel-Chip nur 4.2 und für ein OpenGL 3.3 Tutorial, daher nicht brauchbar.Aber interessant ist es trotzdem. So wie es aussieht, müsste man da auch keine Padding verwenden, um eine 16Byte Block zu füllen ? Wen UBO auf 64KB begrenzt ist, würden immerhin 1'000 Lichtquellen reinpassen ( 4 x 16 x 1'000 = 64'000 ). Oder kennst du ein Beispiel, in dem man an das 64KB-Limit kommt ? |
Autor: | Sascha Willems [ Mo Mär 26, 2018 21:25 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
mathias hat geschrieben: Wen UBO auf 64KB begrenzt ist, würden immerhin 1'000 Lichtquellen reinpassen ( 4 x 16 x 1'000 = 64'000 ). Oder kennst du ein Beispiel, in dem man an das 64KB-Limit kommt ? Die Definition deiner Lichtquellen ist sehr simpel, für echte Lichtquellen benötigt man noch weitere Parameter, dann hat man pro Quelle schnell recht viele Bytes. Und bei einem deferred oder forward clustered Renderer können das durchaus mehrere hunderte Lichtquellen sein die sichtbar sind, da wird das mit dem UBO knapp. SSBOs haben den großen Vorteil dass man die im Compute Shader schreiben kann, und so dann auf der GPU z.B. Culling etc. machen kann. |
Autor: | mathias [ Di Mär 27, 2018 16:10 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
Zitat: Und bei einem deferred oder forward clustered Renderer können das durchaus mehrere hunderte Lichtquellen sein die sichtbar sind, da wird das mit dem UBO knapp. Wen sie zu Laufzeit geändert werden müssen, dann ja. Wen es aber statische Lichtquellen sind, ZB Kandelaber , würde ich die Werte direkt in den Shader als Konstante reinkompilieren.Oder mache ich da einen Denkfehler ? |
Autor: | end [ Mi Mär 28, 2018 00:05 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
Man macht halt immer das, was einem gerade gelegen kommt und wie es in den Speicher passt. Deine Idee mit dem "ich kompiliere die Lichtquelle statisch rein" ist halt unbrauchbar, wenn du Daten zur Laufzeit veraendern willst (weil shader neukompilieren doch etwas dauert), gds. aber brauchbar wenn die Daten halt statisch sind (aber mehr aufwand). Ich persoenlich wuerde halt in 3.3 gar keine UBOs verwenden, sondern wenn ueberhaupt SSBOs (ueber extension vllt?) und ansonsten entweder "normal" uniform arrays nutzen oder den klassischen weg ueber texturen. Das ist sehr einfach zu implementieren und birgt den Vorteil, dass du wahrscheinlich nicht in Performancebegrenzer reinlaeufts. (imho der weg des geringsten widerstands = bester weg) |
Autor: | mathias [ Mi Mär 28, 2018 16:45 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
Zitat: Ich persoenlich wuerde halt in 3.3 gar keine UBOs verwenden, sondern wenn ueberhaupt SSBOs (ueber extension vllt?) In einem Tutorial will ich nicht unbedingt Extensionen verwenden.Zitat: und ansonsten entweder "normal" uniform arrays nutzen Meinst du damit, das ich anstelle der struct eine Array verwende ?In etwa so ?
Element 4-7 --> Diffuse Element 8-11 --> Specular Element 12 --> Shininess Zitat: oder den klassischen weg ueber texturen. Texturen ? Was soll das gehen ? |
Autor: | end [ Do Mär 29, 2018 00:20 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
Ungefaehr so mit den Arrays funktioniert es auf jeden Fall, wichtig ist ja nur, dass die Daten irgendwie ankommen. Genau wie bei Texturen, die sind schliesslich auch nur Buffer. Du kannst Daten reinschreiben und wieder im Shader auslesen... |
Autor: | glAwesome [ Do Mär 29, 2018 07:31 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
mathias hat geschrieben: Eigentlich Schade, das es kein direkter Weg mit glUniformxxx für struct gibt. Doch, gibt es? Code:
|
Autor: | mathias [ Do Mär 29, 2018 17:34 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
glAwesome hat geschrieben: mathias hat geschrieben: Eigentlich Schade, das es kein direkter Weg mit glUniformxxx für struct gibt. Doch, gibt es? Code:
Ist dieser Befehl nicht, um in eine einfache vec3 Uniform zu schreiben, wen man jeden Wert einzeln übergeben will ? Dann doch lieber so: Code:
|
Autor: | glAwesome [ Do Mär 29, 2018 19:08 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
Ja. Du hast natürlich Recht, dass es keinen glUniformStruct() oder sowas gibt, mit dem man ein komplettes struct auf einen Schlag mit Werten belegen kann. Ich wollte nur klarstellen, dass man durchaus Index- und Elementzugriffsoperatoren (also [] und .) in glGetUniformLocation() verwenden darf. Du brauchst nicht zwinged UBOs, nur weil eine uniform-Variable ein struct ist. |
Autor: | mathias [ Do Mär 29, 2018 19:27 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
Ich habe mal folgendes versucht, dies liefert -1, somit ungültig. Code:
Code:
Dies funktioniert wie erwartet auch nicht, auch wen ich die ID mit glGetUniformBlockIndex auslese. Code:
|
Autor: | end [ Fr Mär 30, 2018 12:53 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
Das liegt daran, dass die Bloecke aufgesplittet werden und dann Material.foo[0] oder so heissen. Schau dir mal an wie das aussieht indem du mit glGetActiveUniform dir alle moeglichen Uniforms anzeigen laesst inklusive Namen. https://www.khronos.org/registry/OpenGL ... niform.xml |
Autor: | mathias [ Fr Mär 30, 2018 19:35 ] |
Betreff des Beitrags: | Re: UBO struct mehrmals verwendet |
Das Wiki gibt es sogar in deutsch: https://wiki.delphigl.com/index.php/glGetActiveUniform Ich habe s probiert, mit folgendem Ergebnis: Code:
Ausgabe: Code:
Die Unifom-Blöcke, kann man auch ausgeben. Code:
Ausgabe: Code:
Dies sind noch recht praktische Funktionen, wen man einen Fehler sucht. |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |