DGL
https://delphigl.com/forum/

Shader funktioniert nicht
https://delphigl.com/forum/viewtopic.php?f=20&t=4079
Seite 1 von 1

Autor:  @uzingLG [ Fr Apr 29, 2005 18:48 ]
Betreff des Beitrags:  Shader funktioniert nicht

Hi!
Das ist mein 1. Shader-Versuch:

Laden:
Code:
  1. procedure TGLForm.FormCreate(Sender: TObject);
  2. var
  3.   vst: TStringList;
  4.   VertexText: String;
  5.   VertexL: Integer;
  6.   fst: TStringList;
  7.   FragmentText: String;
  8.   FragmentL: Integer;
  9. begin
  10.   vst:= TStringList.Create;
  11.   vst.LoadFromFile('vertex.txt');
  12.   VertexText:= vst.Text;
  13.   VertexL:= Length(VertexText);
  14.  
  15.   fst:= TStringList.Create;
  16.   fst.LoadFromFile('fragment.txt');
  17.   FragmentText:= fst.Text;
  18.   FragmentL:= Length(FragmentText);
  19.  
  20.   InitOpenGL;
  21.   dc:= GetDC(Handle);
  22.   rc:= CreateRenderingContext(dc, [opDoubleBuffered], 32, 24, 8, 0, 0, 0);
  23.   ActivateRenderingContext(dc,rc);
  24.  
  25.   // Shader
  26.   po:= glCreateProgramObjectARB;
  27.   vs:= glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  28.   fs:= glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  29.  
  30.   glShaderSourceARB(vs, 1, @VertexText, @VertexL);
  31.   glShaderSourceARB(fs, 1, @FragmentText, @FragmentL);
  32.  
  33.   glCompileShaderARB(vs);
  34.   ShowMessage(GetInfoLog(vs));
  35.  
  36.   glCompileShaderARB(fs);
  37.   ShowMessage(GetInfoLog(fs));
  38.  
  39.   glAttachObjectARB(po, vs);
  40.   glAttachObjectARB(po, fs);
  41.  
  42.   glDeleteObjectARB(vs);
  43.   glDeleteObjectARB(fs);
  44.  
  45.   glLinkProgramARB(po);
  46. end;


Rendern:
Code:
  1. procedure TGLForm.Render;
  2. begin
  3.   if rc = 0 then
  4.     exit;
  5.  
  6.   // Viewport
  7.   glViewport(0, 0, ClientWidth, ClientHeight);
  8.   glMatrixMode(GL_PROJECTION);
  9.   glLoadIdentity;
  10.   gluPerspective(90, 1, 1, 100);
  11.  
  12.   // Modelview-Matrix
  13.   glMatrixMode(GL_MODELVIEW);
  14.   glLoadIdentity;
  15.  
  16.   // Rendern beginnen
  17.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT);
  18.  
  19.   // Rendern mit Shader
  20.   glUseProgramObjectARB(po);
  21.  
  22.   glBegin(GL_QUADS);
  23.     glColor4f(1, 0, 0, 1);
  24.     glVertex3f(-1, 1, -2);
  25.     glColor4f(0, 1, 0, 1);
  26.     glVertex3f(-1, -1, -2);
  27.     glColor4f(0, 0, 1, 1);
  28.     glVertex3f(1, -1, -2);
  29.     glColor4f(1, 1, 1, 1);
  30.     glVertex3f(1, 1, -2);
  31.   glEnd;
  32.  
  33.   glUseProgramObjectARB(0);
  34.  
  35.   // Backbuffer flippen
  36.   SwapBuffers(dc);
  37. end;


Vertex Shader:
Code:
  1. vec4 col = vec4(1.0, 1.0, 1.0, 1.0);
  2.  
  3. void main(void)
  4. {
  5.   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  6.   gl_FrontColor = col;
  7. }


Fragment Shader:
Code:
  1. void main(void)
  2. {
  3.   gl_FragColor = gl_FrontColor;
  4. }
Aber das gerenderte Bild schaut genauso aus wie ohne Shader.

[EDIT]Ich bin dem Fehler nähergekommen. Wenn ich GetInfoLog (aus dem Tutorial) für das Programmobjekt aufrufe, erhalte ich das:
Zitat:
Fragment info
------------
error: unknown fragment shader builtin varying parameter (named gl_FrontColor) encountered
Was bedeutet das? Ich verstehe diese Meldung nicht.

Autor:  Grizzly [ Fr Apr 29, 2005 21:03 ]
Betreff des Beitrags: 

Im Fragment shader muss statt gl_FrontColor gl_Color benutzt werden, dann funktioniert der shader auch.

Zitat:
Die Varyings gl_FrontColor, gl_FrontSecondaryColor, gl_BackColor und gl_BackSecondaryColor können im FragmentShader nur unter den Aliases gl_Color bzw. gl_SecondaryColor gelesen werden. Welcher Wert des Vertex Shaders im Fragment Shader dort eingesetzt wird ist abhängig davon ob das Fragment zu einer nach vorne oder nach hinten zeigenden Primitive gehört.

Autor:  @uzingLG [ Sa Apr 30, 2005 11:56 ]
Betreff des Beitrags: 

Thx, jetzt funktioniert er.

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