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

Aktuelle Zeit: Di Jul 22, 2025 08:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit Arrays im Lichtshader
BeitragVerfasst: So Apr 13, 2008 15:37 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
hi,
ich wollte gerade meinen Shader erweitern, um mehrere Lichter gleichzeitig zu behandeln. Dazu habe ich die wichtigsten Funktionen in Schleifen verpackt und zwei Arrays hinzugefügt
Zitat:
---------------------------
Game
---------------------------
Vertex info
-----------
(37) : error C5025: lvalue in assignment too complex
(38) : error C5025: lvalue in assignment too complex
(39) : error C5025: lvalue in assignment too complex
(42) : error C5025: lvalue in assignment too complex
(43) : error C5025: lvalue in assignment too complex
(44) : error C5025: lvalue in assignment too complex

Fragment info
-------------
(8) : error C5041: cannot locate suitable resource to bind parameter "<null atom>"
(8) : error C5041: cannot locate suitable resource to bind parameter "<null atom>"
(8) : error C5041: cannot locate suitable resource to bind parameter "<null atom>"
(8) : error C5041: cannot locate suitable resource to bind parameter "<null atom>"
(8) : error C5041: cannot locate suitable resource to bind parameter "<null atom>"
(8) : error C5041: cannot locate suitable resource to bind parameter "<null atom>"
(8) : error C5041: cannot locate suitable resource to bind parameter "<null atom>"

---------------------------
OK
---------------------------

Das Ganze sieht in Auszügen so aus:

Vertex-Shader:
Code:
  1.  
  2. varying vec3 lightVec[7];
  3. varying vec3 eyeVec[7];
  4. (...)
  5.   for (int i=0; i <lightcount; i++)
  6.   {
  7.     tmpVec = vec3(gl_LightSource[i].position) - vVertex;
  8.  
  9.     lightVec[i].x = dot(tmpVec, t);
  10.     lightVec[i].y = dot(tmpVec, b);
  11.     lightVec[i].z = dot(tmpVec, n);
  12.  
  13.     tmpVec = -vVertex;
  14.     eyeVec[i].x = dot(tmpVec, t);
  15.     eyeVec[i].y = dot(tmpVec, b);
  16.     eyeVec[i].z = dot(tmpVec, n);  
  17.   }

wenn ich das folgendermaßen abändere:
Code:
  1.   for (int i=0; i <lightcount; i++)
  2.   {
  3.     tmpVec = vec3(gl_LightSource[i].position) - vVertex;
  4.     lightVec[i] = vec3(dot(tmpVec, t), dot(tmpVec, b), dot(tmpVec, n));
  5.     tmpVec = -vVertex;
  6.     eyeVec[i] = vec3(dot(tmpVec, t), dot(tmpVec, b), dot(tmpVec, n));
  7.   }

bekomme ich den "too complex" fehler nur zweimal, scheinbar mag er meine Array Zugriffe nicht.

Fragment-Shader:
Code:
  1. uniform int lightcount; // Anzahl der genutzten Lichte
  2.  
  3. varying vec3 lightVec[7];
  4. varying vec3 eyeVec[7];
  5. (...)
  6.   vec4 ColorResult = vec4(0.0, 0.0, 0.0, 0.0); // Farbe des Fragments
  7.   float distSqr = 0.0; // Quadrat des Abstands von Licht und Vertex
  8. (...)
  9.   for (int i=0; i<lightcount; i++)
  10.   {
  11.     distSqr = dot(lightVec[i], lightVec[i]);   
  12. (...)
  13.     ColorResult += (vAmbient*base + vDiffuse*base + vSpecular) * att;  
  14.   }  
  15.  


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 22:14 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Ich konnte die Fehler bis auf einen NullAtom Fehler reduzieren, dann bin ich allerdings nicht mehr weitergekommen. Meine Übergangslösung ist nicht sehr elegant:
Code:
  1. uniform sampler2D colorMap; // Textur
  2. uniform sampler2D normalMap; // Normalmap
  3. uniform float InverseRadius; // Lichtradius (invers)
  4. uniform int lightcount; // Anzahl der genutzten Lichter  
  5.  
  6. varying vec2 texCoord;
  7. varying vec3 lightVec0;
  8. varying vec3 lightVec1;
  9. varying vec3 lightVec2;
  10. (...)
  11.  
  12. void main(void)
  13. {  
  14.   if (lightcount > 0)
  15.   {
  16.     ColorResult += GetLightColorResult(0);
  17.   }
  18. (...)
  19. //  if (lightcount > 3)
  20. //  {
  21. //    ColorResult += GetLightColorResult(3);
  22. //  }
  23.   // Fertig berechnete Farbe  
  24.   gl_FragColor = ColorResult;
  25. }

Das interessante ist, wenn ich die 4 auskommentierten Zeilen wieder rein nehme bekomme ich folgenden Fehler:
Zitat:
---------------------------
Game
---------------------------
Fragment info
-------------
(14) : error C5041: cannot locate suitable resource to bind parameter "eyeVec3"

---------------------------
OK
---------------------------

Der komplette Quellcode findet sich hier:
http://www.exec-dev.de/OpenGL/vertex.txt
http://www.exec-dev.de/OpenGL/fragment.txt

Skurile Fehler scheinen in Verbindung mit glSlang nicht unüblich zu sein ;)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 23:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Also ich kann dabei nur raten: die max. Anzahl von Instruktionen oder die max. Anzahl von Variablen wird überschritten -> ganz wirre Fehler.
Ist nur eine Vermutung. Wenn man eyeVec3 im Fragmentshader raushaut und in Zeile 65

vVec = normalize(eyeVec2);

statt

vVec = normalize(eyeVec3);

schreibt, funktioniert schon mal das Kompilieren und das Linken. Grafisch hab ich den Shader nicht überprüft. Beim kompilieren meckert er ja nicht, erst beim Linken, daher würde ich davon ausgehen, dass die max. Anzahl von Instruktionen oder von Variablen überschritten wurde.

Ist aber nur eine Vermutung

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 15, 2008 14:15 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
hi, liegt dieser Höchstwert nicht weit über dem was ich verwende ? Weil ich schon Shader von anderem Kaliber ausführen konnte afaik.
Naja eine Lichtquelle reicht mir vorerst auch ;)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 07:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Und wenn du die Build in-Lichtquellenstrukturen nutzt? Da gibts es ja schon vordefinierete, welche die Daten enthalten, die mit den Normalen gl-Befehlen für Lichter gesetzt werden.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 15:32 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Was meinst du damit genau ?

Ich nutze ja schon die von OpenGL definierten Befehle für Licht (sprich Position, Ambient etc.)
nur muss ich einige Sachen in meinem Vertex Shader berechnen und diese dem Fragment Shader übergeben.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 16:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Hat sich erledigt, hab ganz übersehen, dass du das im Shader ja schon nutzt. Wer lesen kann ...^^

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


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.012s | 14 Queries | GZIP : On ]