DGL
https://delphigl.com/forum/

glSlang: 1. Eindruck und 1.Schwierigkeit
https://delphigl.com/forum/viewtopic.php?f=20&t=3622
Seite 1 von 1

Autor:  SoulChild [ Mi Dez 29, 2004 14:44 ]
Betreff des Beitrags:  glSlang: 1. Eindruck und 1.Schwierigkeit

Hi,

hab endlich glSlang-fähige Treiber für meine FX5200 und muss sagen, bin absolut begeistert von glSlang.
Das einzige was mich stört sind 2 Dinge:
1. Die niedrige Performance und
2. wäre es perfekt, wenn es das ganze in pascal ähnlicher Sprache geben würde also so wie fxPascal aber mit den features die glSlang hat.
Wäre es nicht realisierbar, eine Compiler dafür zu schreiben, ich meine sollte doch nicht so schwierig sein
einfach ein pascal Shader in die C-Spache durch einen compiler umzuwandeln, das würde den Einstieg für uns Delphier
erleichtern, denn ich denke viele schrecken davor zurück, da der gesehene Code in Beispielen ungewohnt ist.
Nur mal so ne Idee...

Aber ich weiche grad von meiner eigentlichen Frage ab.... ;)

Also hab mir SoS Tutorial schon vor längerer Zeit angesehen, aber nie wirklich was selber gemacht und habe nun innerhalb weniger Minuten einen Light-Shader geschrieben.
Mein Code im Fragment Shader sieht für 2 Lichtquellen so aus:

Code:
  1.  
  2. uniform vec4  LightColor0    , LightColor1;
  3. uniform vec4  LightPos0      , LightPos1;
  4. uniform float LightStrength0 , LightStrength1;
  5. varying vec4  vpos;   //<- Position des Fragments
  6.  
  7. void main(void)
  8. {
  9.   float d;
  10.  
  11.   d             = 1.0 - distance(LightPos0,vpos)/LightStrength0;
  12.   gl_FragColor  = LightColor0*d;
  13.   d             = 1.0 - distance(LightPos1,vpos)/LightStrength1;
  14.   gl_FragColor  += LightColor1*d;
  15. }
  16.  


Vielleicht ist meine Frage bereits jetzt klar geworden...
was ist wenn ich 10 oder mehr Lichtquellen haben will,
dann wird der Code sehr unübersichtlich.
Mein Problem ist: Wie übergebe ich arrays, oder Strukturen in die Shader
und wie kann ich dann z.B. eine For-Schleife über die ganzen Lichquellen laufen lassen,
mein Probelm dabei ist die Überprüfung der Länge des Arrays (length(Array)oder Hight(Array) geht ja im Shader nicht...Oder???)

Nun ja ansonsten komm ich eigentlcih voll klar :-)

Dateianhänge:
Dateikommentar: hier nochmal ne Screenshoot, weil ich so begeistert bin.


SHADOW

Light(glSlang).JPG
Light(glSlang).JPG [ 9.12 KiB | 7509-mal betrachtet ]

Autor:  Sascha Willems [ Mi Dez 29, 2004 16:36 ]
Betreff des Beitrags:  Re: glSlang: 1. Eindruck und 1.Schwierigkeit

Shadow hat geschrieben:
hab endlich glSlang-fähige Treiber für meine FX5200 und muss sagen, bin absolut begeistert von glSlang.

Für Shader ist die FX5200 die denkbar schlechteste Karte, da es sonst keine Karte mit so schlechter Shaderperformance gibt. Die FX-Reihe hat so schon keine sehr gute Shaderperformance, aber die FX5200 ist da ja auch das untere Ende. Aber für 199€ gibts schon ne Sparkel GF6600GT, mit der man dann SM3.0 und brauchbare glSlang-Performance hat.

Shadow hat geschrieben:
Vielleicht ist meine Frage bereits jetzt klar geworden...
was ist wenn ich 10 oder mehr Lichtquellen haben will,
dann wird der Code sehr unübersichtlich.
Mein Problem ist: Wie übergebe ich arrays, oder Strukturen in die Shader

Siehe Kapitel 4.12 in meinem Tut. Dort wird erklärt wie man Strukturen im Shader nutzt. Die Datenübergabe an Strukturen geht dann wie gewohnt über glUniform, und dann halt Parametername z.B. Light[1].Position.

Shadow hat geschrieben:
und wie kann ich dann z.B. eine For-Schleife über die ganzen Lichquellen laufen lassen,
mein Probelm dabei ist die Überprüfung der Länge des Arrays (length(Array)oder Hight(Array) geht ja im Shader nicht...Oder???)

Grafikkarten sind im Gegensatz zu CPUs keine "General Purpose"-PUs und von daher recht eingeschränkt (je nach SM). Sowas wie dynamische Arrays gibt es nicht. Du musst deinem Shader also in einer uniform mitteilen wie groß dein Array ist.

Autor:  Gast [ Mi Dez 29, 2004 23:04 ]
Betreff des Beitrags: 

Als Schüler hab ich noch nicht das Geld mir ne Grafikkarte zu kaufen, sollte wohl n bissl sparen... ;)

ABER Ich Versteh das mit den Strukturen noch nicht so ganz:
ICh will ja diese ganzen uniform variabeln nicht da haben z.B.

Code:
  1.  
  2. uniform vec4 light_0_pos,light_1_pos, ... ,light_N_pos
  3. uniform vec4 light_0_color,light_1_color, ... ,light_N_color
  4. uniform float light_0_strength,light_1_strength, ... ,light_N_strength
  5.  


Sprich:N-Lichter

was du mir jetzt erklärt hast ist, dass ich folgendes tun kann
Code:
  1.  
  2. TLight lights[N]
  3.  
  4. for (i=0;i>N;i++)
  5. {
  6. ...// und dann jedes Licht in die Array speichern
  7. }
  8.  



Trotzdem muss ich doch noch so viele uniform variablen deklarieren wie ich lichter habe oder versteh ich da was falsch????Es gibt doch sicherlich eine Methode, die nicht in meinem Kopf existiert ;), wie ich z.B: immer nur die Attribute eines Licht
an den Shader übergebe und dieser die Werte dem Array hinzufügt.

Komm grad voll nicht mehr klar :-)

Autor:  SoulChild [ Do Dez 30, 2004 00:11 ]
Betreff des Beitrags: 

Ups war nicht eingeloggt

Autor:  Sascha Willems [ Do Dez 30, 2004 17:20 ]
Betreff des Beitrags: 

Ich versteh nicht ganz was du willst. Du MUSST deine Arrays im Shader fest definieren, das ist nunmal so. Bei Lichtern kann man sich übrigens Arbeit sparen, da man ja direkt im Shader auf die fest eingebauten OpenGL-States für bis zu 32 Lichtquellen zugreifen kann.

Autor:  Thunderman [ Do Dez 30, 2004 20:11 ]
Betreff des Beitrags: 

Ansonsten bleibt dir wohl nur übrig für jede Lichtquelle, oder immer für 8 Lichtquellen zu rendern und das ganze dann zu blenden, sprich wie früher auch. Aber mit glsl hab ich mich selbst noch nicht beschäftigt. Fange eh gerade erst selbst wieder an mich mit OpenGL zu beschäftigen, aber Zeit ist halt knapp.

Autor:  SoulChild [ Fr Dez 31, 2004 20:25 ]
Betreff des Beitrags: 

Fühl mich irgendwie missverstanden. :(

Mal anders gefragt:
Aus dem Tut geht nicht hervor, wie man Strukturen/Arrays von dem Programm an den Shader übergibt, und ob das möglich ist.
Find die Stelle jedenfalls nicht.

Shadow

Autor:  Sascha Willems [ Sa Jan 01, 2005 13:51 ]
Betreff des Beitrags: 

BItte? Genau das hab ich oben doch gesagt, Das geht ganz normal über glUniform, und dann halt der Teil der Struktur den du setzen willst, also z.B. Light[0].Color.

Autor:  SoulChild [ Sa Jan 01, 2005 17:46 ]
Betreff des Beitrags: 

ich glaub wir reden an einander vorbei ;)
Egal, ich probier mal einfach aus, wenn ich ne Lösung hab, kann ich es dir ja zeigen, denn das was du beschreibst iss nicht mein problem
aber trotzdem: danke :)

Autor:  Sascha Willems [ Sa Jan 01, 2005 18:04 ]
Betreff des Beitrags: 

Wir reden nicht aneinander vorbei. Man kann ganz einfach nicht einen kompletten record aus dem Programm heraus an den Shader mit nur einem Befehl übergeben. Wie sollte dass denn auch gehen, ohne spezielle API?

Autor:  SoulChild [ Sa Jan 01, 2005 21:11 ]
Betreff des Beitrags: 

Gut, dann kommen wir der sache schon näher, man kann also nicht einen ganzen record an den Shader schicken, ist auch nicht so wild, dann muss ich halt jeweils die attribute einzeln an den shader schicken und dort dann in eine struktur packen. hab ich doch jetzt richtig verstanden?!? ;)
Sorry hatte es am Anfang missverstanden.
Mein Problem war:Ob ich irgendwie dann eine for schgleife über die uniform variablen laufen kann, hab nähmlich in Ayas Beispiel irgendwie nur eine Lichtquelle gesehen, die sah ungefähr so aus:

uniform vec4 Light#_Position;
uniform vec4 Light#_Direction;
uniform vec4 Light#_Color;
uniform vec3 Light#_Intensity;

Aber trotzdem werden dann 4 oder 5 Lichter genutzt, als werden nicht 5 mal die variablen deklariert, dass versteh ich net.
Muss irgendwas mit der Raute zu tun haben.
Und so wollte ich es auch hinkriegen, denn das ist viel übersichtlicher, vielleicht hast du jetzt verstanden, was ich meine.
SORRY für das missverständniss.

Autor:  LarsMiddendorf [ So Jan 02, 2005 13:47 ]
Betreff des Beitrags: 

Das mit der Raute kannst du vergessen. Das hat er nur eingebaut, um Shader für eine bestimmte Anzahl von Lichtern dynamisch zu generieren. Steht glaube ich auch in dem Thread irgendwo.
Mit den Arrays funktioniert das so, wie Sascha bereits erklärt hat. Man muß die Addresse jeder einzelnen Variablen mit Index ermitteln und dann den Wert setzen:
Code:
  1. i:=glGetUniformLocation('lights[0].position');
  2. if i<>-1 then glUniform3f(i,x,y,z);

Wenn du Shader dynamisch zusammensetzen willst, dann nimm am besten direkt ARB_fp. Da hat man einfach zwei große Arrays mit Vectoren: program.local[] und program.env[] . Das letztere ist für alle Programme gleich, so dass man dort Informationen speichern kann, die nicht nur zu einem Programm gehören,wie z.B. die Lichtposition oder Farbe. Programmübergreifende Variablen gehen mit glsl leider nicht.

Autor:  SoulChild [ Mo Jan 03, 2005 13:33 ]
Betreff des Beitrags: 

gut, das hilft mir sehr,
danke.

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