DGL
https://delphigl.com/forum/

Problem mit Arrays im Lichtshader
https://delphigl.com/forum/viewtopic.php?f=20&t=7422
Seite 1 von 1

Autor:  Seth [ So Apr 13, 2008 15:37 ]
Betreff des Beitrags:  Problem mit Arrays im Lichtshader

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

Autor:  Seth [ Mo Apr 14, 2008 22:14 ]
Betreff des Beitrags: 

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

Autor:  littleDave [ Mo Apr 14, 2008 23:50 ]
Betreff des Beitrags: 

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

Autor:  Seth [ Di Apr 15, 2008 14:15 ]
Betreff des Beitrags: 

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

Autor:  Pellaeon [ Do Apr 24, 2008 07:15 ]
Betreff des Beitrags: 

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.

Autor:  Seth [ Do Apr 24, 2008 15:32 ]
Betreff des Beitrags: 

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

Autor:  Pellaeon [ Do Apr 24, 2008 16:37 ]
Betreff des Beitrags: 

Hat sich erledigt, hab ganz übersehen, dass du das im Shader ja schon nutzt. Wer lesen kann ...^^

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