DGL
https://delphigl.com/forum/

Shaders problem
https://delphigl.com/forum/viewtopic.php?f=19&t=4378
Seite 1 von 1

Autor:  BTierens [ Mi Jul 27, 2005 19:11 ]
Betreff des Beitrags:  Shaders problem

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);
}

Autor:  La Boda [ Mi Jul 27, 2005 20:01 ]
Betreff des Beitrags: 

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;

Autor:  BTierens [ Do Jul 28, 2005 16:56 ]
Betreff des Beitrags: 

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.  

Autor:  La Boda [ Do Jul 28, 2005 17:26 ]
Betreff des Beitrags: 

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. (...)

Autor:  BTierens [ Do Jul 28, 2005 18:28 ]
Betreff des Beitrags: 

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]
339-mal heruntergeladen

Autor:  Gast [ Sa Jul 30, 2005 08:11 ]
Betreff des Beitrags: 

I've managed to write a shaders hello world in FreePascal. Thanks for your help.

Autor:  La Boda [ Sa Jul 30, 2005 10:19 ]
Betreff des Beitrags: 

You are welcome
Could you please tell me how you made it?

Autor:  BTierens [ Sa Jul 30, 2005 14:44 ]
Betreff des Beitrags: 

I used your second demo and replaced your shaders by the hello world shaders. Then I replaced the TForm OpenGL surface by SDL.

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