Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 30, 2025 23:13

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Erster Shader Versuch: Fehlschlag
BeitragVerfasst: Di Aug 15, 2006 13:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 15, 2006 13:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
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.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 15, 2006 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Autsch.
Darauf hätte ich auch kommen können.

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

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.021s | 17 Queries | GZIP : On ]