DGL
https://delphigl.com/forum/

Shader lassen sich nicht compilieren
https://delphigl.com/forum/viewtopic.php?f=20&t=9869
Seite 1 von 1

Autor:  Coolman1974 [ So Apr 24, 2011 06:08 ]
Betreff des Beitrags:  Shader lassen sich nicht compilieren

Hallo zusammen und frohe Ostern!

Habe ein kleines Demo-Projektchen aufgesetzt um mit Shaderen warm zu werden.
Ich render in der Scene ein Quad mit einer Textur drauf.

Den Shadercode den ich testen möchte, habe ich von hier:
http://www.blitzbasic.com/Community/posts.php?topic=85263

Hier der Code um den Shader zu initialisieren:
Code:
  1.  
  2. procedure TForm2.Button5Click(Sender: TObject);
  3. var
  4.   FragmentShaderObject : GLhandle;
  5.   ShaderText: String;
  6.   ShaderLength: Integer;
  7.   Shader: TStringList;
  8. const
  9.   tc_offsetArr: array[0..8] of Single = (1.0,2.0,1.0,2.0,1.0,2.0,1.0,2.0,1.0);
  10. begin
  11.   showmessage(gluErrorString(glGetError));
  12.  
  13.   Shader := TStringList.Create;
  14.   try
  15.     Shader.LoadFromFile('Shader_Blur_frag.txt');
  16.     ShaderText := Shader.Text;
  17.     ShaderLength := Length(ShaderText);
  18.  
  19.     FragmentShaderObject := glCreateShader(GL_FRAGMENT_SHADER);
  20.     glShaderSource(FragmentShaderObject, 1, @ShaderText, @ShaderLength);
  21.     glCompileShader(FragmentShaderObject);
  22.     ShowMessage(GetInfoLog(FragmentShaderObject));
  23.  
  24.     ProgramObject := glCreateProgram;
  25.  
  26.     glAttachShader(ProgramObject, FragmentShaderObject);
  27.  
  28.     glDeleteShader(FragmentShaderObject);
  29.  
  30.     glLinkProgram(ProgramObject);
  31.  
  32.     glUniform1i(glGetUniformLocation(ProgramObject, PGLCharARB('sampler0')), 1);
  33.     glUniform2fvARB(glGetUniformLocation(ProgramObject, PGLCharARB('tc_offset')), 9,
  34.       @tc_offsetArr);
  35.   finally
  36.     Shader.Free;
  37.   end;
  38. end;
  39.  


Hier der Code des Fragmentshaders:
Code:
  1.  
  2. // blur (low-pass) 3x3 kernel
  3.  
  4. uniform sampler2D sampler0;
  5. uniform vec2 tc_offset[9];
  6.  
  7. void main(void)
  8. {
  9.     vec4 sample[9];
  10.  
  11.     for (int i = 0; i < 9; i++)
  12.     {
  13.         sample[i] = texture2D(sampler0,
  14.                               gl_TexCoord[0].st + tc_offset[i]);
  15.     }
  16.  
  17. //   1 2 1
  18. //   2 1 2   / 13
  19. //   1 2 1
  20.  
  21.     gl_FragColor = (sample[0] + (2.0*sample[1]) + sample[2] +
  22.                     (2.0*sample[3]) + sample[4] + (2.0*sample[5]) +
  23.                     sample[6] + (2.0*sample[7]) + sample[8]) / 13.0;
  24.  
  25. }
  26.  


Von der Fehlermeldung habe ich einen Screenshot gemacht.

Erst hatte ich in meiner Verzeiflung angenommen, das hier kein Kommentar im Code gewünscht ist.
Somit habe ich die Zeile "// blur (low-pass) 3x3 kernel" entfernt.
Nun habe ich selbige Fehlermeldung nur mit "u" bekommen anstatt mit "/".

Hat jemand eine Ahnung was ich falsch mache?

Ich bin auch die "Checkliste" im Wiki durchgegangen!

Dateianhänge:
Dateikommentar: Fehlermeldung
GLSL_Error.jpg
GLSL_Error.jpg [ 14.1 KiB | 6444-mal betrachtet ]

Autor:  Coolcat [ So Apr 24, 2011 09:34 ]
Betreff des Beitrags:  Re: Shader lassen sich nicht compilieren

Vermutlich ein WideString-Problem. OpenGL erwartet den Shader als utf8, also mit 8bit pro Zeichen. Ich glaube Delphi verwendet bei normalen Strings 16bit pro Zeichen. Also anderen String-Typ benutzen.

Autor:  Ireyon [ So Apr 24, 2011 12:19 ]
Betreff des Beitrags:  Re: Shader lassen sich nicht compilieren

Probier mal AnsiString, der kann auch mehr als 256 Zeichen.

Autor:  Lord Horazont [ So Apr 24, 2011 12:20 ]
Betreff des Beitrags:  Re: Shader lassen sich nicht compilieren

AnsiString.
@Ireyon: String kann das auch (bei FreePascal aber nur mit {$H+}).

greetings

Autor:  Coolman1974 [ So Apr 24, 2011 17:12 ]
Betreff des Beitrags:  Re: Shader lassen sich nicht compilieren

Dankeschön,

der Tip war absolut richtig!

habs nun so gelöst:

Code:
  1.  
  2. ...
  3.     Shader.LoadFromFile('Shader_Blur_frag.txt');
  4.     ShaderText := UTF8Encode(Shader.Text);
  5.     ShaderLength := Length(ShaderText);
  6.  
  7.     FragmentShaderObject := glCreateShader(GL_FRAGMENT_SHADER);
  8.     glShaderSource(FragmentShaderObject, 1, @ShaderText, @ShaderLength);
  9.     glCompileShader(FragmentShaderObject);
  10.     ShowMessage(GetInfoLog(FragmentShaderObject));
  11. ...
  12.  

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