Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 22, 2025 08:09

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Dez 29, 2004 14:44 
Offline
DGL Member

Registriert: Fr Jan 10, 2003 20:18
Beiträge: 88
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 | 7505-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Dez 29, 2004 16:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 29, 2004 23:04 
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 :-)


Nach oben
  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 30, 2004 00:11 
Offline
DGL Member

Registriert: Fr Jan 10, 2003 20:18
Beiträge: 88
Ups war nicht eingeloggt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 30, 2004 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 30, 2004 20:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
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.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 31, 2004 20:25 
Offline
DGL Member

Registriert: Fr Jan 10, 2003 20:18
Beiträge: 88
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 01, 2005 13:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 01, 2005 17:46 
Offline
DGL Member

Registriert: Fr Jan 10, 2003 20:18
Beiträge: 88
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 :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 01, 2005 18:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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?

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 01, 2005 21:11 
Offline
DGL Member

Registriert: Fr Jan 10, 2003 20:18
Beiträge: 88
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 02, 2005 13:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 03, 2005 13:33 
Offline
DGL Member

Registriert: Fr Jan 10, 2003 20:18
Beiträge: 88
gut, das hilft mir sehr,
danke.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 17 Queries | GZIP : On ]