DGL
https://delphigl.com/forum/

Array Deklaration
https://delphigl.com/forum/viewtopic.php?f=20&t=11362
Seite 1 von 2

Autor:  mathias [ So Apr 05, 2015 17:27 ]
Betreff des Beitrags:  Array Deklaration

Wieso gibt dies keinen Fehler ?

Bei transforms ist keine Länge angegeben.

Code:
  1. ...
  2. uniform vec2 transforms[];
  3. ...
  4.  
  5. void main() {
  6.    DataOut.UV.x = transforms[12].x;
  7. ...


Oder kennt glsl etwa dynamische Arrays ?

Autor:  Sascha Willems [ So Apr 05, 2015 20:04 ]
Betreff des Beitrags:  Re: Array Deklaration

Code:
  1. uniform vec2 transforms[];


Ist ein unitialsiertes Array, kein dynamisches. Syntaktisch ist das okay.

Der Zugriff sollte aber eigentlich keine echten Werte ausgeben, es sei denn du belegst das Array irgendwo mit Werten.

Autor:  mathias [ Mo Apr 06, 2015 17:22 ]
Betreff des Beitrags:  Re: Array Deklaration

Ich will gerne einen ANSI-String an den Geometrie-Shader übergeben.

Code:
  1. glUniform1uiv(ShaderID.CharTransforms, Length(Text), @Text[1]);

Code:
  1. uniform uint Text[256];


Das Problem, GLSL kennt nur 32-Bit Integer.

So wie es aussieht, muss ich im Pascal-Code den String zuerst in eine Integer-Array konvertieren.
Oder gibt es eine elegantere Lösung ?

Autor:  OpenglerF [ Mo Apr 06, 2015 19:15 ]
Betreff des Beitrags:  Re: Array Deklaration

Du kannst doch einfach Bit Operationen nutzen um die einzelnen 8 Bit Integer zu erhalten.

Ehrlich gesagt frage ich mich aber, was du genau erreichen willst. Erzeugen großer Mengen im Geometry Shader wird normalerweise nicht unbedingt empfohlen. Hast du schon mal überlegt, ob du die Integer nicht ganz einfach in ein VBO packen kannst und dann im Vertex Shader verarbeiten? Mit Instancing besteht auch die Möglichkeit, ein Quad sehr oft mit verschiedenen Zeichen zu rendern.

Autor:  mathias [ Mo Apr 06, 2015 21:18 ]
Betreff des Beitrags:  Re: Array Deklaration

Zitat:
Du kannst doch einfach Bit Operationen nutzen um die einzelnen 8 Bit Integer zu erhalten.

Meinst du die shl und shr Befehle ?

Autor:  OpenglerF [ Mo Apr 06, 2015 21:28 ]
Betreff des Beitrags:  Re: Array Deklaration

Ich weiß nicht, was shl und shr sein.
Ich meine <<, >>, &, |
Erst die ersten 8 Bit ausschneiden. Dann 8 Bits nach rechts schieben und die nächsten 8 Bit ausschneiden. Und so weiter.

Autor:  mathias [ Mo Apr 06, 2015 21:56 ]
Betreff des Beitrags:  Re: Array Deklaration

Zitat:
Ich meine <<, >>, &, |
Erst die ersten 8 Bit ausschneiden. Dann 8 Bits nach rechts schieben und die nächsten 8 Bit ausschneiden. Und so weiter.

Genau das meine ich, in Pascal und in Assembler schiebt man Bits mir shr und shl hin und her.

Zitat:
Erzeugen großer Mengen im Geometry Shader wird normalerweise nicht unbedingt empfohlen.

Ich dachte, der Geometrie-Shader sei für diesen Zweck gedacht.


Meine Idee, ich wollte eine Text-Ausgabe mit dem Geo-Shader machen.
Dazu wollte ich soviele Rechtecke kopieren, wie es Buchstaben im Text hat.

Ausserhalb des Shader funktioniert es bis jetzt.

Autor:  OpenglerF [ Mo Apr 06, 2015 22:41 ]
Betreff des Beitrags:  Re: Array Deklaration

Ne, eigentlich ist der Geometry Shader nicht dafür gedacht. Er ist für kleine Änderungen an der Geometrie gedacht, nicht um unbegrenzt neu Dreiecke zu erzeugen. Das ist auch offensichtlich langsam, schließlich arbeitet der Geometry Shader seriell und nicht parallel.

Ich würde die Buchstabendaten in ein VBO packen und damit rendern. Im Prinzip genauso, bloß kann dann jeder Buchstabe/Vertex parallel verarbeitet werden.

Ansonsten kannst du es im Compute Shader oder auf der CPU probieren. Um ehrlich zu sein, glaube nicht nicht, dass die Grafikkarte zum Generieren der Textrenderingdaten prinzipiell so gut geeignet ist.

Autor:  mathias [ Di Apr 07, 2015 17:03 ]
Betreff des Beitrags:  Re: Array Deklaration

Das es keine Missverständnisse gibt, beschreibe ich meine Routine nochmals.

Bei InitScene:
Zuerst wird eine Bitmap erzeugt, auf der alle Buchstaben vorhanden sind, nachher wird das Ganze in der Textur-Speicher kopiert.
In einer Array werden dazu die Textur-Koordinaten der einzelnen Buchstaben gespeichert.

Beim Rendern:
Dort kann ich einen String angeben, welcher jedes mal anders sein darf.
Dazu habe ich ein Schleife, in der Rechtecke gerendert werden, je nach Anzahl Chars.
Bei jedem Rechteck werden dann die Textur-Koordinaten, je nach Char mitgegeben. Z.B. beim 'A' Koordinate 65, beim 'B' 66 etc. .

Dazu wollte ich die Schleife zum rendern in den Geo-Shader packen.
Aber so wie es aussieht, ist es besser, wen dies Aufgabe die CPU übernimmt.



Zitat:
Ne, eigentlich ist der Geometry Shader nicht dafür gedacht,

Wie machen es die Game-Hersteller bei komplexen Spielfiguren, werden dies alle von der CPU erzeugt ?

Autor:  Sascha Willems [ Di Apr 07, 2015 17:21 ]
Betreff des Beitrags:  Re: Array Deklaration

mathias hat geschrieben:
Zitat:
Ne, eigentlich ist der Geometry Shader nicht dafür gedacht,

Wie machen es die Game-Hersteller bei komplexen Spielfiguren, werden dies alle von der CPU erzeugt ?


Bei solchen Projekten wird die Geometrie ja von den Künstlern erzeugt, nicht von den Entwicklern. Die Modelle kommen also fertig als 3D-Modell, werden dann mit Physik versehen. Das Skinning und das LOD macht dann die GPU, aber die erzeugt da keine Daten via GS oder so, es sei denn man nutzt wirklich Tesselation, aber damit erzeugt man dann ja i.d.R. nur Details.

Ansonsten sind Geometrie Shader auch noch zu aktuell um sie breitflächig einzusetzen.

Autor:  OpenglerF [ Di Apr 07, 2015 18:36 ]
Betreff des Beitrags:  Re: Array Deklaration

Tesselation "erzeugt" halt auch nicht wirklich die Daten, sondern wendet nur weitere Details an, die zum Beispiel in Texturen gespeichert wurden.

Außer Mathias hat ganz besonders ausgefallene Ideen mit Text, für die durchschnittliche Anwendung ist ein erzeugen von texturierten Rechtecken auf der CPU nicht verkehrt. Das erlaubt mehr komplexere Features und ist potentiell sogar effizienter. Schließlich kann man viele Texte einmal vorbereiten und dann oft wiederverwenden. Geometry Shader ist für normales Text Rendering jedenfalls ziemlich wenig geeignet, denke ich.

Autor:  Sascha Willems [ Di Apr 07, 2015 18:39 ]
Betreff des Beitrags:  Re: Array Deklaration

OpenglerF hat geschrieben:
Tesselation "erzeugt" halt auch nicht wirklich die Daten, sondern wendet nur weitere Details an, die zum Beispiel in Texturen gespeichert wurden.


Für die (nicht mehr vorhandene) fest verdrahtete Tesselation ja (z.B. ATIs Truform) ja, mit Geometry Shadern kann man da viel mehr machen, auch komplexe Geometrie erzeugen. Die existiert dann halt nur auf der GPU, aber damit ist viel mehr möglich als nur reine Tesselation ;)

Autor:  OpenglerF [ Di Apr 07, 2015 18:41 ]
Betreff des Beitrags:  Re: Array Deklaration

Geometry Shader Tesselation wird halt eben zum Beispiel nicht empfholen. Die Performance soll extrem schlecht sein.
Deshalb hat man ja die ganzen Tesselation Shader eingeführt. Theoretisch würde das auch der Geometry Shader können, aber es ist nicht praktikabel.

Autor:  mathias [ Di Apr 07, 2015 19:09 ]
Betreff des Beitrags:  Re: Array Deklaration

So sieht das Eegebniss bis jetzt aus, siehe Anhang.


Zitat:
Deshalb hat man ja die ganzen Tesselation Shader eingeführt.

Ist das richtig, wen man einen Tesselations Shader verwendet, das dann auch ein Geo-Shader gebraucht wird ?
Mit Google habe ich gesehen, das immer beide Shader verwendet werden.

Dateianhänge:
Zwischenablage-3.png
Zwischenablage-3.png [ 235.48 KiB | 14425-mal betrachtet ]

Autor:  OpenglerF [ Di Apr 07, 2015 21:18 ]
Betreff des Beitrags:  Re: Array Deklaration

Nein, das ist nicht richtig.

Es gibt sogar einige Leute, die die Ansicht vertreten, dass der Geometry Shader möglicherweise entfernt werden könnte, weil er zwar alle Aufgaben theoretisch übernehmen kann, aber kein richtig.

EDIT: Satzbau :roll:

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/