DGL
https://delphigl.com/forum/

Programmobjekt-Fehlermeldung
https://delphigl.com/forum/viewtopic.php?f=20&t=7528
Seite 1 von 1

Autor:  Rüdiger [ Do Mai 22, 2008 19:09 ]
Betreff des Beitrags:  Programmobjekt-Fehlermeldung

Hey Leute!


Weiß jemand von euch, woher folgender Fehler kommen kann, den mir der Fehlerstring vom Programmobjekt ausspuckt? Bei mir tritt er nicht auf, nur bei einem Kollegen von mir. Die Shader-FehlerStrings weisen danach keine Fehler auf.


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




Viele Grüße

Autor:  Lord Horazont [ Do Mai 22, 2008 19:27 ]
Betreff des Beitrags: 

Also ohne Code ist das buntes Rätselraten.

Gruß Lord Horazont

Autor:  Rüdiger [ Do Mai 22, 2008 20:02 ]
Betreff des Beitrags: 

Nabend,

vor allen Dngen würde mich interessieren, wann ein solcher Fehler generiert wird.


Aber hier den Code - vielleicht findet ja jemand den Fehler :)


Vertexshader:
Code:
  1. void main(void)
  2. {
  3.   gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  4.   gl_TexCoord[0]  = gl_MultiTexCoord0;
  5.   gl_TexCoord[1]  = gl_TextureMatrix[1] * gl_MultiTexCoord1;
  6.   gl_FrontColor   = gl_Color;
  7. }


Fragmentshader:
Code:
  1.  
  2. uniform float strength;
  3. uniform sampler2D refractTex;
  4. uniform sampler2D bumpMap;
  5.  
  6. void main(void)
  7. {
  8.   vec4 refractcoord;
  9.   vec4 offsetColor = (texture2D(bumpMap, vec2(gl_TexCoord[1])) +
  10.     texture2D(bumpMap, vec2(gl_TexCoord[1]) * 4.0)) / 2.0;
  11.   vec4 origOffset = offsetColor;
  12.   vec4 refractColor = vec4(1.0, 1.0, 1.0, 1.0);
  13.   vec4 blendedColor;
  14.  
  15.   offsetColor -= 0.5;
  16.   offsetColor *= 2.0;
  17.  
  18.   refractcoord = gl_TexCoord[0];
  19.   refractcoord.x += strength * offsetColor[0];
  20.   refractcoord.z += strength * offsetColor[1];
  21.   refractcoord = gl_TextureMatrix[0] * refractcoord;
  22.   refractColor = texture2DProj(refractTex, refractcoord);
  23.  
  24.  
  25.   refractColor[3] = 1.0;
  26.  
  27.   blendedColor = refractColor * gl_Color;
  28.   blendedColor.a = 1.0;
  29.  
  30.   gl_FragColor = blendedColor;
  31. }
  32.  



Hier noch der Code, mit dem die Shader eingebunden und ausgeführt werden, Uniforms übergeben werden und mit dem der Log erzeugt wird:

Code:
  1.  
  2. procedure TShader.Load(VertexCode,FragmentCode : String);
  3.   var tmpLen : Integer;
  4. begin
  5.   ProgramObject  := glCreateProgram;
  6.  
  7.   if Length(VertexCode) > 0 then
  8.   begin
  9.     tmpLen := Length(VertexCode);
  10.     VertexShader := glCreateShader(GL_VERTEX_SHADER);
  11.     glShaderSource(VertexShader,1,@VertexCode,@tmpLen);
  12.     glCompileShader(VertexShader);
  13.     glAttachShader(ProgramObject, VertexShader);
  14.     glDeleteShader(VertexShader);
  15.   end;
  16.  
  17.   if Length(FragmentCode) > 0 then
  18.   begin
  19.     tmpLen := Length(FragmentCode);
  20.     FragmentShader := glCreateShader(GL_FRAGMENT_SHADER);
  21.     glShaderSource(FragmentShader,1,@FragmentCode,@tmpLen);
  22.     glCompileShader(FragmentShader);
  23.     glAttachShader(ProgramObject, FragmentShader);
  24.     glDeleteShader(FragmentShader);
  25.   end;
  26.   glLinkProgram(ProgramObject);
  27.  
  28.   LogManager.AddLog(2,'Info-Log: ' + Self.GetInfoLog);
  29.  
  30. end;
  31.  
  32. procedure TShader.Use;
  33. begin
  34.   glUseProgram(ProgramObject);
  35. end;
  36.  
  37. procedure TShader.AssignInt(Variable : String; Value : Integer);
  38. begin
  39.   glUniform1i(glGetUniformLocation(ProgramObject, PChar(Variable)), Value);
  40. end;
  41.  
  42. procedure TShader.AssignFloat(Variable : String; Value : Double);
  43. begin
  44.   glUniform1f(glGetUniformLocation(ProgramObject, PChar(Variable)), Value);
  45. end;
  46.  
  47. procedure TShader.Stop;
  48. begin
  49.   glUseProgram(0);
  50. end;
  51.  
  52. function TShader.GetInfoLog : string;
  53. var
  54.   Len, Len2: Integer;
  55. begin
  56.   Result := 'Programmobjekt: ';
  57.   glGetProgramiv(ProgramObject, GL_INFO_LOG_LENGTH, @Len);
  58.   SetLength(Result, Length(Result)+Len);
  59.   glGetProgramInfoLog(ProgramObject, Len, Len2, @Result[1]);
  60.  
  61.   Result := Result + ' VertexShader: ';
  62.   glGetShaderiv(VertexShader, GL_INFO_LOG_LENGTH, @Len);
  63.   SetLength(Result, Length(Result)+Len);
  64.   glGetShaderInfoLog(VertexShader, Len, Len2, @Result[Length(Result)-Len-1]);
  65.  
  66.   Result := Result + ' FragmentShader: ';
  67.   glGetShaderiv(FragmentShader, GL_INFO_LOG_LENGTH, @Len);
  68.   SetLength(Result, Length(Result)+Len);
  69.   glGetShaderInfoLog(FragmentShader, Len, Len2, @Result[Length(Result)-Len-1]);
  70. end;


Viele Grüße

Autor:  WhiteHunter [ Do Mai 22, 2008 20:38 ]
Betreff des Beitrags: 

"Nicht genug Ressourcen"... ich hätte jetzt zur Art der Fehlermeldung gesagt, das ist ne ältere Karte, die nicht genug Platz für irgendeine Sorte von Variablen hat.

Da es sich wohl um die gleichen Shader handelt, an die ich denke, würde ich mich mal aus dem Fenster lehnen:
Nutzt er wirklich nicht die alten Shader? In deren Fragment stehen in Zeile 5 die varyings.
Und im Gegensatz zu meinem Treiberproblem wird da wahrscheinlich die Graka keine vollen 32 floats erlauben.

Nur ne Vermutung, nicht hauen, wenns falsch ist ;)

PS: So wie du das Log verarbeitest, solltest du aufpassen, dass du das #0 nicht mitnimmst, das OGL am Ende eines InfoLogs platziert. Wenn doch, schneidet Delphi an dieser Stelle mW den String ab.

PPS: Zu dem Zeitpunkt, an dem du versuchst, die Shader-Infologs zu erzeugen, hast du die Shader bereits gelöscht. :D

MfG

Autor:  Rüdiger [ Fr Mai 23, 2008 09:04 ]
Betreff des Beitrags: 

Oh mann...

Du hast vollkommen recht. Das ist jetzt eigentlich zu peinlich.... :)

Vielen Dank für die Mühe!

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