DGL
https://delphigl.com/forum/

Erster Shader Versuch: Fehlschlag
https://delphigl.com/forum/viewtopic.php?f=20&t=5809
Seite 1 von 1

Autor:  Lord Horazont [ Di Aug 15, 2006 13:13 ]
Betreff des Beitrags:  Erster Shader Versuch: Fehlschlag

Hi @ll

nachdem ich mir mal die Beispiele im 2006-er SDK angeschaut habe, dacht ich mir, dass man mit Shadern mit wenig Aufwand doch einiges schaffen kann.
Also hab ich mir auch gleich das glSlang-Tutorial im Wiki durchgelesen. Allerdings mit bescheidenem Erfolg: Als ich das ganze implementiert habe, hat sich keine wirkung gezeigt. Die GetLogInfo-Funktionen werfen nur leere zurück. Im Rendering kann ich keine Veränderung entdecken, obwohl mein Fragment-Shader die Farbe auf 0.0,0.0,0.0,0.0 setzt. Aber jeden Frame bekomme ich ein invalid operation, wenn ich glUniform4fARB aufrufe und die Betrachterposition übergeben will (wollte mal versuchen nen Nebel-Shader zu schreiben).

Wo liegt mein Fehler?

Code:
  1.  
  2. var
  3.   ProgramObject, FragmentShaderObject, VertexShaderObject: GLHandleARB;
  4.   FShader: TStringList;
  5.   FShaderText: String;
  6.   FShaderLength: Integer;
  7.   VShader: TStringList;
  8.   VShaderText: String;
  9.   VShaderLength: Integer;
  10.   Log: PChar;
  11.   LogLength: Integer;
  12. begin
  13.   if FileExists(FFilename) and FileExists(VFilename) then
  14.   begin
  15.     ProgramObject := glCreateProgramObjectARB;
  16.  
  17.     FragmentShaderObject := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  18.     VertexShaderObject := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  19.  
  20.     FShader := TStringList.Create;
  21.     FShader.LoadFromFile(FFilename);
  22.     FShaderText := FShader.Text;
  23.     FShaderLength := Length(FShaderText);
  24.     FShader.Destroy;
  25.  
  26.     VShader := TStringList.Create;
  27.     VShader.LoadFromFile(VFilename);
  28.     VShaderText := VShader.Text;
  29.     VShaderLength := Length(VShaderText);
  30.     VShader.Destroy;
  31.  
  32.     glShaderSourceARB(VertexShaderObject, 1, @VShaderText, @VShaderLength);
  33.     glShaderSourceARB(FragmentShaderObject, 1, @FShaderText, @FShaderLength);
  34.  
  35.     glCompileShaderARB(FragmentShaderObject);
  36.     WriteLn(glSlang_GetInfoLog(FragmentShaderObject));
  37.     glCompileShaderARB(VertexShaderObject);
  38.     WriteLn(glSlang_GetInfoLog(VertexShaderObject));
  39.  
  40.     glAttachObjectARB(ProgramObject, VertexShaderObject);
  41.     glAttachObjectARB(ProgramObject, FragmentShaderObject);
  42.  
  43.     glDeleteObjectARB(FragmentShaderObject);
  44.     glDeleteObjectARB(VertexShaderObject);
  45.  
  46.     glLinkProgramARB(ProgramObject);
  47.  
  48.  
  49.     WriteLn(glSlang_GetInfoLog(ProgramObject));
  50.  
  51.     Result := ProgramObject;
  52.   end
  53.   else
  54.   begin
  55.     WriteLn(FFilename);
  56.     WriteLn(VFilename);
  57.     WriteLn('Shader not found');
  58.     raise Exception.Create('');
  59.   end;
  60. end;
  61.  

- ja die Shader werden geladen.

Code:
  1.  
  2. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  3.   glLoadIdentity;
  4.  
  5.   glTranslatef(0, 0, -5);
  6.   glRotatef(XRotation, 1, 0, 0);
  7.   glRotatef(YRotation, 0, 1, 0);
  8.  
  9.  
  10.   glUniform4fARB(glGetUniformLocationARB(ProgramObject, PGLCharARB('viewpos')), 0.0, 0.0, -5.0, 1.0);
  11.   glColor3f(0, 0.75, 1);
  12.   glBegin(GL_QUADS);
  13.     glVertex3f(-10, 0, -10);
  14.     glVertex3f(-10, 0, 10);
  15.     glVertex3f(10, 0, 10);
  16.     glVertex3f(10, 0, -10);
  17.   glEnd;
  18.  
  19.  
  20.  
  21.   //Error Handler
  22.   Error := glgetError;
  23.   if Error <> GL_NO_ERROR then
  24.   begin
  25.     Caption := gluErrorString(Error);
  26.     //Rendering kurz anhalten
  27.     Done := True;
  28.     FlashWindow(Handle, True)
  29.   end;
  30.   //Frame Counter
  31.   Inc(Frames);
  32.   if GetTickCount - StartTick >=500 then
  33.   begin
  34.     FrameText := Format('FPS: %f x:%f° y:%f°', [Frames/(GetTickCount - StartTick)*1000, XRotation, YRotation]);
  35.     Frames := 0;
  36.     StartTick := GetTickCount
  37.   end;
  38.   //Und anzeigen
  39.   SwapBuffers(Canvas.Handle)
  40.  

- und hier wird gerendert.

Vertex-Shader
Code:
  1.  
  2. varying vec4 vpos;
  3.  
  4. void main(void)
  5. {
  6.   vpos            = gl_Vertex;
  7.   gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  8.   gl_TexCoord[0]  = gl_MultiTexCoord0;
  9. }
  10.  


Fragment-Shader
Code:
  1.  
  2. uniform vec4 viewpos;
  3. varying vec4 vpos;
  4.  
  5.  
  6. void main(void)
  7. {
  8.   gl_FragColor  = vec4(0.0,0.0,0.0,0.0);
  9. }
  10.  


P.S.
Was mich noch interessiert: Kann man im Fragment-Shader irgendwie auslesen, welche Farbe vom Programm gesetzt wurde? (In meinem Fall: glColor3f(0.0, 0.75, 1.0);)

Gruß Lord Horazont

Autor:  La Boda [ Di Aug 15, 2006 13:47 ]
Betreff des Beitrags: 

Du musst vor dem Zeichnen glUseProgram(ProgramObject) aufrufen, das lässt sich genauso wie glBindTexture handhaben.

Die Farbe, die per glColor3f(...) dem Vertex übergeben wurde, lässt sich ganz einfach durch das vordefinierte Attribut (read only!) gl_Color auslesen.

Autor:  Lord Horazont [ Di Aug 15, 2006 15:03 ]
Betreff des Beitrags: 

Autsch.
Darauf hätte ich auch kommen können.

Trotzdem (oder gerade deswegen :wink: ): Danke!

Gruß Lord Horazont

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