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

Aktuelle Zeit: Fr Apr 19, 2024 04:56

Foren-Übersicht » English » English Programming Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Shaders problem
BeitragVerfasst: Mi Jul 27, 2005 19:11 
Offline
DGL Member

Registriert: Fr Aug 13, 2004 17:43
Beiträge: 60
Wohnort: Belgien
Hi,

I want to learn OpenGL shading language and I'm trying to make a shader "hello world" in FreePascal. Shaders are supported but I don't see anyting in my OpenGL window (yes, the quad is in the view frustum ;) ). Can somebody help me?

Code:
  1.  
  2. {$mode Delphi}
  3. program shaders;
  4.  
  5. uses dglOpenGL,SDL,sysUtils,classes;
  6. var
  7.   screen: PSDL_Surface; //SDL Screen
  8.   exited: boolean;
  9.   shader1: GLhandleARB;
  10.   shader2: GLhandleARB;
  11.   p: GLhandleARB;
  12.   lpos: Array[0..3] of GLFloat = (1,0.5,1,0);
  13.  
  14. function loadShader(src: String; shaderType: GLenum): GLhandleARB;
  15. var
  16.   source: PChar;
  17.   compiled,len: Integer;
  18. begin
  19.   source := PChar(src);
  20.   Result := glCreateShaderObjectARB(shaderType);
  21.   len := Length(src);
  22.   glShaderSourceARB(Result,1,@source,@len);
  23.   glCompileShaderARB(Result);
  24.   glGetObjectParameterivARB(Result,GL_OBJECT_COMPILE_STATUS_ARB,@compiled);
  25.   if compiled <> GL_TRUE then
  26.   begin
  27.     writeln('An error has occuped while loading shader');
  28.   end;
  29. end;
  30.  
  31. //************************************************************************************************
  32. //Loads a shader
  33. //************************************************************************************************
  34. function loadShaderFromFile(filename: String; shaderType: GLenum): GLhandleARB;
  35. var
  36.   shaderTxt: TStringList;
  37.   source: PChar;
  38.   compiled,len: Integer;
  39. begin
  40.   shaderTxt := TStringList.Create();
  41.   shaderTxt.LoadFromFile(filename);
  42.   try
  43.     Result := loadShader(shaderTxt.Text,shaderType);
  44.   except
  45.     writeln('An error has occuped while loading shader ' + fileName);
  46.   end;
  47.   shaderTxt.Free;
  48. end;
  49.  
  50. //************************************************************************************************
  51. //Resize window
  52. //************************************************************************************************
  53. procedure resizeWindow(swidth, sheight: integer);
  54. var
  55.   ratio: GLfloat;
  56. begin
  57.   //Protect against a divide by zero
  58.   if(sheight = 0) then
  59.   sheight := 1;
  60.   ratio := swidth/sheight;
  61.   glMatrixMode(GL_PROJECTION);
  62.   glLoadIdentity();
  63.   glViewport(0,0,swidth,sheight);
  64.   glMatrixMode(GL_MODELVIEW);
  65. end;
  66.  
  67.  
  68. var
  69.   videoFlags: integer;
  70.   event: TSDL_Event;
  71. begin
  72.   videoFlags := SDL_OPENGL;
  73.   //initialize SDL
  74.   if(SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) < 0) then
  75.   begin
  76.     writeLn('Video initialization failed');
  77.     halt(1);
  78.   end;
  79.   SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
  80.   SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE,8);
  81.  
  82.   //get a SDL surface
  83.   screen := SDL_SetVideoMode(640,480,16,videoFlags);
  84.  
  85.   initOpenGL();
  86.   glEnable(GL_DEPTH_TEST);
  87.   glClearColor(1.0,1.0,1.0,1.0);
  88.   glEnable(GL_CULL_FACE);
  89.  
  90.   //resize the initial window
  91.   resizeWindow(640,480);
  92.   SDL_WM_SetCaption(PChar('Shaders demo'),'');
  93.  
  94.   glEnable(GL_VERTEX_PROGRAM_ARB);
  95.   glEnable(GL_FRAGMENT_PROGRAM_ARB);
  96.   shader1 := loadShaderFromFile(ExtractFilePath(paramStr(0)) + 'shader.txt',GL_VERTEX_PROGRAM_ARB);
  97.   shader2 := loadShaderFromFile(ExtractFilePath(paramStr(0)) + 'shader2.txt',GL_FRAGMENT_SHADER_ARB);
  98.   glBindProgramARB(GL_VERTEX_PROGRAM_ARB,shader1);
  99.   glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB,shader2);
  100.   p := glCreateProgramObjectARB();
  101.   glAttachObjectARB(p,shader1);
  102.   glAttachObjectARB(p,shader2);
  103.   glLinkProgramARB(p);
  104.   glUseProgramObjectARB(p);
  105.  
  106.   while not exited do
  107.   begin
  108.     while (SDL_PollEvent(@event) = 1) do
  109.     begin
  110.       case event.type_ of
  111.         SDL_VIDEORESIZE:
  112.         begin
  113.           resizeWindow(event.resize.w,event.resize.h);
  114.         end;
  115.         SDL_KEYDOWN:
  116.         begin
  117.           case event.key.keysym.sym of
  118.           SDLK_ESCAPE :
  119.           begin
  120.             exited := true;
  121.           end;
  122.           end;
  123.         end;
  124.       end;
  125.     end;
  126.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  127.     glLoadIdentity();
  128.     glBegin(GL_QUADS);
  129.       glVertex3f(0,0,-10);
  130.       glVertex3f(10,0,-10);
  131.       glVertex3f(10,10,-10);
  132.       glVertex3f(0,10,-10);
  133.     glEnd();
  134.     SDL_GL_SwapBuffers();
  135.   end;
  136. end.
  137.  
  138.  


This are the shaders:
shader.txt:
void main()
{
gl_Position = ftransform();
}
shader2.txt:
void main()
{
gl_FragColor = vec4(0.4,0.4,0.8,1.0);
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 27, 2005 20:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Oh, you got the same thing wrong like I when I started into GLSL. Here Vertex-and Fragmentprogramm are a unity! Ya always need the both of them. Here is my Shader-Loading-Function:
Code:
  1. function LoadFragmentandVertexShader(FFilename: string; VFilename: string): GLHandleARB;
  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. begin
  11. if FileExists(FFilename)= True then
  12. if FileExists(VFilename)= True then
  13. begin
  14.  ProgramObject:= glCreateProgramObjectARB;
  15.  
  16.  FragmentShaderObject:= glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  17.  VertexShaderObject:= glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  18.  
  19.  FShader:= TStringList.Create;
  20.  FShader.LoadFromFile(FFilename);
  21.  FShaderText:= FShader.Text;
  22.  FShaderLength:= Length(FShaderText);
  23.  
  24.  VShader:= TStringList.Create;
  25.  VShader.LoadFromFile(VFilename);
  26.  VShaderText:= VShader.Text;
  27.  VShaderLength:= Length(VShaderText);
  28.  
  29.  glShaderSourceARB(VertexShaderObject, 1, @VShaderText, @VShaderLength);
  30.  glShaderSourceARB(FragmentShaderObject, 1, @FShaderText, @FShaderLength);
  31.  
  32.  glCompileShaderARB(FragmentShaderObject);
  33.  glCompileShaderARB(VertexShaderObject);
  34.  
  35.  glAttachObjectARB(ProgramObject, FragmentShaderObject);
  36.  glAttachObjectARB(ProgramObject, VertexShaderObject);
  37.  
  38.  glDeleteObjectARB(FragmentShaderObject);
  39.  glDeleteObjectARB(VertexShaderObject);
  40.  glLinkProgramARB(ProgramObject);
  41.  
  42.  Result:= ProgramObject;
  43. end
  44. else
  45.  ShowMessage('Fehler: Shader-Datei konnte nicht gefunden werden!')
  46. else
  47.  ShowMessage('Fehler: Shader-Datei konnte nicht gefunden werden!')
  48. end;

_________________
"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: Do Jul 28, 2005 16:56 
Offline
DGL Member

Registriert: Fr Aug 13, 2004 17:43
Beiträge: 60
Wohnort: Belgien
The demo uses both a vertex and a fragment shader. I changed the code so it looks more like the lighthouse3d hello world but I still don't see the vertex shaded. Did I forget to enable something or to call a OpenGL function?

Code:
  1.  
  2. {$MODE DELPHI}
  3. Program shaders;
  4.  
  5. Uses windows,dglOpenGL,sysutils,glut,classes;
  6.  
  7. var
  8.   ProgramObject,FragmentShaderObject,VertexShaderObject: GLhandleARB;
  9.   lpos: Array[0..3] of GLFloat = (1,0.5,1,0);
  10.  
  11. {------------------------------------------------------------------------------}
  12. Procedure InitGL;
  13. var
  14.   FShader: TStringList;
  15.   FShaderText: String;
  16.   FShaderLength: Integer;
  17.   VShader: TStringList;
  18.   VShaderText: String;
  19.   VShaderLength: Integer;
  20. begin
  21.   glClearDepth(1.0);
  22.   glEnable(GL_DEPTH_TEST);
  23.   glDepthFunc(GL_LEQUAL);
  24.   glMatrixMode(GL_PROJECTION);
  25.   glLoadIdentity();
  26.    
  27.   glViewport(0, 0, 320, 320);
  28.  
  29.   gluPerspective(45,1,1,1000);
  30.   glMatrixMode(GL_MODELVIEW);
  31.  
  32.   glEnable(GL_CULL_FACE);
  33.  
  34.   FragmentShaderObject:= glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  35.   VertexShaderObject:= glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  36.  
  37.   FShader:= TStringList.Create;
  38.   FShader.LoadFromFile(ExtractFilePath(paramStr(0)) + 'shader2.txt');
  39.   FShaderText:= FShader.Text;
  40.   FShaderLength:= Length(FShaderText);
  41.  
  42.   VShader:= TStringList.Create;
  43.   VShader.LoadFromFile(ExtractFilePath(paramStr(0)) + 'shader.txt');
  44.   VShaderText:= VShader.Text;
  45.   VShaderLength:= Length(VShaderText);
  46.  
  47.   glShaderSourceARB(VertexShaderObject, 1, @VShaderText, @VShaderLength);
  48.   glShaderSourceARB(FragmentShaderObject, 1, @FShaderText, @FShaderLength);
  49.  
  50.   glCompileShaderARB(FragmentShaderObject);
  51.   glCompileShaderARB(VertexShaderObject);
  52.  
  53.   glAttachObjectARB(ProgramObject, FragmentShaderObject);
  54.   glAttachObjectARB(ProgramObject, VertexShaderObject);
  55.  
  56.   glDeleteObjectARB(FragmentShaderObject);
  57.   glDeleteObjectARB(VertexShaderObject);
  58.  
  59.   glLinkProgramARB(ProgramObject);
  60.  
  61.   glUseProgramObjectARB(ProgramObject);
  62. end;
  63.  
  64. {------------------------------------------------------------------------------}
  65. Procedure Render();
  66. begin
  67.   glClear(GL_COLOR_BUFFER_BIT);
  68.  
  69.   glLoadIdentity();
  70.   gluLookAt(0.0,0.0,5.0,0.0,0.0,-1.0,0.0,1.0,0.0);
  71.  
  72.   glLightfv(GL_LIGHT0, GL_POSITION, lpos);
  73.   glutSolidTeapot(1);
  74.  
  75.   glFlush();
  76.   glutSwapBuffers();
  77. end;
  78.  
  79. {------------------------------------------------------------------------------}
  80. Procedure InitWindow();
  81. begin
  82.   glutInit(@argc, argv);           //let GLUT do some initialization
  83.   glutInitWindowPosition(100,100);
  84.   glutInitWindowSize(320,320);
  85.   glutInitDisplayMode(GLUT_DEPTH or GLUT_DOUBLE or GLUT_RGBA);
  86.   glutCreateWindow('Shader demo'); //now create the first window
  87.   glutDisplayFunc(@render);          //register callback functions
  88.   glutIdleFunc(@render);
  89.   initGL;
  90.   glutMainLoop;                    //and now actually run
  91. end;
  92.  
  93. {------------------------------------------------------------------------------}
  94. Begin
  95.   initOpenGL();
  96.   InitWindow;
  97. end.
  98.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 28, 2005 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Have your shaders the right lines?
You wrote:
Zitat:
void main()
{
gl_Position = ftransform();
}


Is ftransform the same as gl_ModelViewProjectionMatrix * gl_Vertex;?
And try some other Colors for glFragColor.
Check your shaders with the follwing Code:
Code:
  1. function CheckForErrors(glObject: GLHandleARB): String;
  2.  var
  3.   blen, slen: GLInt;
  4.   InfoLog   : PGLCharARB;
  5. begin
  6.  glGetObjectParameterivARB(glObject, GL_OBJECT_INFO_LOG_LENGTH_ARB, @blen);
  7.  if blen > 1 then
  8.  begin
  9.   GetMem(InfoLog, blen*SizeOf(GLCharARB));
  10.   glGetInfoLogARB(glObject, blen , slen, InfoLog);
  11.   Result:= PChar(InfoLog);
  12.   Dispose(InfoLog);
  13.  end;
  14. end;  

Usage:
Code:
  1.  
  2. (...)
  3.  glCompileShaderARB(FragmentShaderObject);
  4.  glCompileShaderARB(VertexShaderObject);
  5.  
  6.  ShowMessage(CheckForErrors(FragmentShaderObject));
  7.  ShowMessage(CheckForErrors(VertexShaderObject));
  8. (...)

_________________
"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: Do Jul 28, 2005 18:28 
Offline
DGL Member

Registriert: Fr Aug 13, 2004 17:43
Beiträge: 60
Wohnort: Belgien
Still the same. Ftransform is the same as gl_ModelViewProjectionMatrix * gl_Vertex;

The attachment contains the demo source, shaders and executable.


Dateianhänge:
Dateikommentar: The demo source, shaders and executable
shaders.zip [219.36 KiB]
313-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 30, 2005 08:11 
I've managed to write a shaders hello world in FreePascal. Thanks for your help.


Nach oben
  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 30, 2005 10:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
You are welcome
Could you please tell me how you made it?

_________________
"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: Sa Jul 30, 2005 14:44 
Offline
DGL Member

Registriert: Fr Aug 13, 2004 17:43
Beiträge: 60
Wohnort: Belgien
I used your second demo and replaced your shaders by the hello world shaders. Then I replaced the TForm OpenGL surface by SDL.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 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 : 6.933s | 18 Queries | GZIP : On ]