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

Aktuelle Zeit: So Jul 20, 2025 15:38

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Fragmentshader funzt nicht
BeitragVerfasst: Do Jul 19, 2007 13:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 18, 2007 23:53
Beiträge: 2
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 19, 2007 14:39 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 19, 2007 17:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 18, 2007 23:53
Beiträge: 2
Es handelt sich um eine GeForce 4 4200Ti mit 8xAGP


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 19, 2007 19:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die kann keine Fragment Shader.
Für einen Überblick ist auch folgende Seite mit Extension Datenbank gut: http://www.delphi3d.net/hardware/index.php


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.019s | 17 Queries | GZIP : On ]