DGL
https://delphigl.com/forum/

Fragmentshader funzt nicht
https://delphigl.com/forum/viewtopic.php?f=20&t=6762
Seite 1 von 1

Autor:  Imperator [ Do Jul 19, 2007 13:22 ]
Betreff des Beitrags:  Fragmentshader funzt nicht

Beim esten Versuch einen Shader zu programmieren stellte sich schon folgendes Problem heraus:
Erst ein mal der Quelltext:

Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  8.   dglOpenGL, ExtCtrls, StdCtrls, Log;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     Timer1: TTimer;
  13.     Panel1: TPanel;
  14.     Label1: TLabel;
  15.     vshaderScript: TMemo;
  16.     fshaderScript: TMemo;
  17.     procedure FormCreate(Sender: TObject);
  18.     procedure FormPaint(Sender: TObject);
  19.     procedure Timer1Timer(Sender: TObject);
  20.     procedure FormResize(Sender: TObject);
  21.   private
  22.     programObject:glHandleARB;
  23.     vertexShaderObject:glHandleARB;
  24.     fragmentShaderObject:glHandleARB;
  25.     function glSlang_GetInfoLog(glObject : GLHandleARB) : String;
  26.   public
  27.      hDC: HDC;
  28.      hRC: HGLRC;
  29.   end;
  30.  
  31. var
  32.   Form1: TForm1;
  33.   LogView: TLogView;
  34.  
  35. implementation
  36.  
  37. {$R *.DFM}
  38.  
  39. procedure TForm1.FormCreate(Sender: TObject);
  40. var fshaderlength:Integer;
  41. var fshadertext:String;
  42. var vshaderlength:Integer;
  43. var vshadertext:String;
  44. begin
  45.      LogView:=TLogView.Create(Form1);
  46.      LogView.Visible:=true;
  47.      InitOpenGL();
  48.      LogView.makelog('InitGl');
  49.      hDC:=GetDC(Panel1.Handle);
  50.      hRC:= CreateRenderingContext( hDC,
  51.                                [opDoubleBuffered],
  52.                                32,
  53.                                24,
  54.                                0,0,0,
  55.                                0);
  56.       ActivateRenderingContext(hDC, hRC);
  57.       LogView.makelog('ActivateRenderingContext');
  58.       glViewport(0, 0, ClientWidth, ClientHeight);
  59.       glMatrixMode(GL_PROJECTION);
  60.       glLoadIdentity;
  61.       gluPerspective(45, ClientWidth/ClientHeight, 1, 100);
  62.       glMatrixMode(GL_MODELVIEW);
  63.  
  64.  
  65.       programObject:=glCreateProgramObjectARB;
  66.       vertexShaderObject:= glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  67.       fragmentShaderObject:= glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  68.       LogView.makelog('Create Shader');
  69.       vshadertext:=self.vshaderScript.Lines.text;
  70.       fshadertext:=self.fshaderScript.Lines.text;
  71.       vshaderlength:=length(vshadertext);
  72.       fshaderlength:=length(fshadertext);
  73.       LogView.makelog('Vertexshader: '+vshadertext);
  74.       LogView.makelog('Länge: '+inttostr(vshaderlength));
  75.       LogView.makelog('Fragmentshader: '+fshadertext);
  76.       LogView.makelog('Länge: '+inttostr(fshaderlength));
  77.       glShaderSourceARB(VertexShaderObject, 1, @vshadertext, @vshaderlength);
  78.       glShaderSourceARB(FragmentShaderObject, 1, @fshadertext, @fshaderlength);
  79.       glCompileShaderARB(VertexShaderObject);
  80.       LogView.makelog('Compile Vertexshader:' +glSlang_GetInfoLog(VertexShaderObject));
  81.       glCompileShaderARB(FragmentShaderObject);
  82.       LogView.makelog('Compile Fragmentshader:' +glSlang_GetInfoLog(FragmentShaderObject));
  83.       glAttachObjectARB(ProgramObject, VertexShaderObject);
  84.       glAttachObjectARB(ProgramObject, FragmentShaderObject);
  85.       glDeleteObjectARB(VertexShaderObject);
  86.       glDeleteObjectARB(FragmentShaderObject);
  87.       glLinkProgramARB(ProgramObject);
  88.       LogView.makelog('Linke Programmobjekt:' +glSlang_GetInfoLog(ProgramObject));
  89.  
  90.       glUseProgramObjectARB(ProgramObject);
  91.       Timer1.Enabled:=true;
  92.       LogView.makelog('Starte Hauptschleife');
  93. end;
  94.  
  95. function TForm1.glSlang_GetInfoLog(glObject : GLHandleARB) : String;
  96. var
  97.  blen,slen : GLInt;
  98.  InfoLog   : PGLCharARB;
  99. begin
  100. glGetObjectParameterivARB(glObject, GL_OBJECT_INFO_LOG_LENGTH_ARB , @blen);
  101. if blen > 1 then
  102.  begin
  103.  GetMem(InfoLog, blen*SizeOf(GLCharARB));
  104.  glGetInfoLogARB(glObject, blen, slen, InfoLog);
  105.  Result := PChar(InfoLog);
  106.  Dispose(InfoLog);
  107.  end;
  108. end;
  109.  
  110. procedure TForm1.FormPaint(Sender: TObject);
  111. begin
  112.       glViewport(0, 0, ClientWidth, ClientHeight);
  113.       glMatrixMode(GL_PROJECTION);
  114.       glLoadIdentity;
  115.       gluPerspective(45, ClientWidth/ClientHeight, 1, 100);
  116.       glMatrixMode(GL_MODELVIEW);
  117. end;        
  118.  
  119. procedure TForm1.Timer1Timer(Sender: TObject);
  120. begin
  121.     glMatrixMode(GL_MODELVIEW);
  122.     glClearColor(1,0,0,0);
  123.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  124.     glLoadIdentity();
  125.     glBegin(GL_QUADS);
  126.     glVertex3f(1,1,-5);          glColor3f(1,0,0);
  127.     glVertex3f(-1,1,-5);         glColor3f(0,1,0);
  128.     glVertex3f(-1,-1,-5);        glColor3f(0,0,1);
  129.     glVertex3f(1,-1,-5);         glColor3f(1,0,1);
  130.     glEnd();
  131.  
  132.  
  133.     SwapBuffers(hDC);
  134. end;
  135.  
  136. procedure TForm1.FormResize(Sender: TObject);
  137. begin
  138.      glViewport(0, 0, ClientWidth, ClientHeight);
  139.      glMatrixMode(GL_PROJECTION);
  140.      glLoadIdentity;
  141.      gluPerspective(45, ClientWidth/ClientHeight, 1, 100);
  142.      glMatrixMode(GL_MODELVIEW);
  143. end;
  144.  
  145. end.
  146.  
  147.  


Bei dem Objekt LogView handelt es sich um ein zweites Formular, welches nur ein Memo enthält, dass über die Prozedur 'makelog' Infos anzeigt. Die Shaderquelltexte werden in den Memos vshaderScript und fshaderScript verwaltet und beim Start im LogView nochmals angezeigt.
Wenn ich das Programm nun starte zeigt LogView folgendes:

InitGl
ActivateRenderingContext
Create Shader
Vertexshader:
void main(void)
{
vec4 a = gl_Vertex;
a.x=a.x*0.5;
a.y=a.y*0.5;
gl_Position = gl_ModelViewProjectionMatrix * a;

}

Länge: 133
Fragmentshader:
void main(void)
{
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

Länge: 74
Compile Vertexshader:
Compile Fragmentshader:
Linke Programmobjekt:
Starte Hauptschleife

Es gibt also keine Fehler im Shadertext
Angezeigt sollte ich nun ein verkleinertes Quadrat welches weiß eingefärbt ist, bekommen. Leider ist das Quadrat verkleinert aber schwarz. Um zu prüfen, ob meine Grafikkarte schuld war fand ich folgendes heraus:
Vertexshaders: 2 (v.1.1)
Pixelshaders: 1 (v.1.3)
Mir ist klar, dass der Pixelshader dem Fragmentshader äquivalent ist.
Beim Shadertesten mit dem Programm aus dem 2. Tutorial zum Shader auf wiki.delphigl.com funktionierte dieser ebenfalls nicht und die dort angezeigt Kugel blieb schwarz.

Autor:  oc2k1 [ Do Jul 19, 2007 14:39 ]
Betreff des Beitrags: 

Was für eine Grafikkarte ist es? Pixelshader 1.3 sieht nach etwas sehr altem aus... GLSL braucht mindestens eine Karte die Pixelshader 2.0 unterstützt (besser 3.0)

Autor:  Imperator [ Do Jul 19, 2007 17:35 ]
Betreff des Beitrags: 

Es handelt sich um eine GeForce 4 4200Ti mit 8xAGP

Autor:  LarsMiddendorf [ Do Jul 19, 2007 19:15 ]
Betreff des Beitrags: 

Die kann keine Fragment Shader.
Für einen Überblick ist auch folgende Seite mit Extension Datenbank gut: http://www.delphi3d.net/hardware/index.php

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