Forum > OpenGL

FreeGlut

(1/2) > >>

Seenkao:
Хотелось бы знать, куда обратиться, чтоб в FreePascal(Lazarus), вместо Glut сделали указание на FreeGlut, или хотя бы возможность подменять Glut на FreeGlut.

Указания в библиотеке идут на Glut, а в Glut прописан FreeGlut, но с библиотекой от Glut. А надо именно прописывать FreeGlut.

Эта проблема проявляется на Windows и MacOS, для Linux оказалось достаточно установить библиотеку.

FreeGlut работает как с устаревшим функционалом, так и с шейдерами! На MacOS я так же запустил, единственно не смог проверить шейдеры, не поддерживает видеокарта OpenGL больше 2.1.

Для Windows скачать FreeGlut и использовать нужную версию.

Для MacOS: XQuartz - скачиваем и устанавливаем.
Brew - следуем инструкциям.

Google translate:
I would like to know where to go, so that in FreePascal (Lazarus), instead of Glut, they made an indication of FreeGlut, or at least the ability to replace Glut with FreeGlut.

The directions in the library go to Glut, and in Glut FreeGlut is registered, but with a library from Glut. And you just need to register FreeGlut.

This problem manifests itself on Windows and MacOS, for Linux it turned out to be enough to install the library.

FreeGlut works with both legacy features and shaders! I also ran it on MacOS, the only thing I could not check the shaders, does not support the OpenGL video card more than 2.1.

For Windows, download FreeGlut and use the correct version.

For MacOS: XQuartz - download and install.
Brew - follow the instructions.


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program Glut_01; {$mode objfpc}{$H+}{.$Define CORE_GL}uses  dynlibs, sysutils,  GL, glu, Glut, FreeGlut, GLext; const  AppWidth = 800;  AppHeight = 600; type  point = array[1..2] of GLfloat;   {$IfDef CORE_GL}  TShader = record    vbo_point, vao_point, shaderProgram, vertexArrayObject: GLuint;    uniform_viewportSize: GLint;  end;   TAAPLVertex = record    position: array [0..1] of single;    color: array [0..2] of single;  end;  {$EndIf} var  {$IfnDef CORE_GL}  p: point = (0.0, 0.0);  vertices: array[1..3] of point = ((0.0, 0.0), (400.0, 600.0),(800.0, 0.0));  {$Else}  gOffsetXY: point = (0, 0);  gSize: Single = 100;  gShader: TShader;  verts: array[0..2] of TAAPLVertex;   GLErrorStr: string = '';  {$EndIf} {$IFDEF CORE_GL}const//Simple Vertex Shader    kVert = '#version 330'+#10'layout(location = 0) in vec2 position;'+#10'layout(location = 1) in vec3 color;'+#10'out vec3 fClr;'+#10'uniform vec2 viewportSize;'+#10'void main() {'+#10'    gl_Position = vec4((position / (viewportSize/2)), 0.0, 1.0);'+#10'    fClr = color;'+#10'}'; //Simple Fragment ShaderkFrag = '#version 330'+#10'in vec3 fClr;'+#10'out vec4 color;'+#10'void main() {'+#10'    color = vec4(fClr, 1);'+#10'}'; procedure ReportErrorsGL(glObjectID: GLuint);var  s : string;  maxLength : GLint;begin  glGetShaderiv(glObjectID, GL_INFO_LOG_LENGTH, @maxLength);  if (maxLength < 2) then exit;  setlength(s, maxLength);  glGetShaderInfoLog(glObjectID, maxLength, @maxLength, @s[1]);  s:=trim(s);  if GLErrorStr = '' then begin     GLErrorStr := 'GLSL error '+s;     {$IFDEF UNIX}writeln(GLErrorStr); {$ENDIF}  end;end; procedure GetError(p: integer; str: string = '');  //report OpenGL Errorvar  Error: GLenum;  s: string;beginError := glGetError();if Error = GL_NO_ERROR then exit;  s := inttostr(p)+'->';if Error = GL_INVALID_ENUM then    s := s+'GL_INVALID_ENUM'else if Error = GL_INVALID_VALUE then    s := s+'GL_INVALID_VALUE' //out of range https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glGetError.xmlelse     s := s + inttostr(Error);if GLErrorStr = '' then begin    GLErrorStr := 'GLSL error '+str+s;    {$IFDEF UNIX}writeln(GLErrorStr);{$ENDIF}end;end; function compileShaderOfType (shaderType: GLEnum;  shaderText: string): GLuint;var   status: GLint;begin     result := glCreateShader(shaderType);     glShaderSource(result, 1, PChar(@shaderText), nil);     glCompileShader(result);     ReportErrorsGL(result);     status := 0;     glGetShaderiv(result, GL_COMPILE_STATUS, @status);     if (status =  0) and (GLErrorStr = '') then begin //report compiling errors.        GLErrorStr := 'GLSL shader compile failure';     end;end; procedure ReportCompileProgramError(glObjectID: GLuint);var  s : string;  maxLength : GLint;begin  glGetProgramiv(glObjectID, GL_LINK_STATUS, @maxLength);  //if (maxLength = GL_TRUE) then exit;  if (maxLength = 1) then exit; //DGL  GL_TRUE  maxLength := 4096;  setlength(s, maxLength);  glGetProgramInfoLog(glObjectID, maxLength, @maxLength, @s[1]);  if maxLength < 1 then begin     if GLErrorStr = '' then        GLErrorStr := ('Program compile error (unspecified)');     exit  end;  s:=trim(s);  if (length(s) < 2) then exit;  if GLErrorStr = '' then          GLErrorStr := ('Program compile error '+s);end; function  initVertFrag(vert, frag: string): GLuint;var   fs, vs: GLuint;begin  result := 0;  vs := 0;  glGetError();  result := glCreateProgram();  if (length(vert) > 0) then begin     vs := compileShaderOfType(GL_VERTEX_SHADER, vert);     if (vs = 0) then exit;     glAttachShader(result, vs);  end;  fs := compileShaderOfType(GL_FRAGMENT_SHADER, frag);  if (fs = 0) then exit;  glAttachShader(result, fs);  glLinkProgram(result);  ReportCompileProgramError(result);  if (length(vert) > 0) then begin     glDetachShader(result, vs);     glDeleteShader(vs);  end;  glDetachShader(result, fs);  glDeleteShader(fs);  GetError(123,'newShader');  glGetError();end; function  initVertFragX(vert, frag: string): GLuint;var   fr, vt: GLuint;begin    result := 0;    glGetError(); //<- ignore proior errors    vt := compileShaderOfType(GL_VERTEX_SHADER, vert);    fr := compileShaderOfType(GL_FRAGMENT_SHADER, frag);    if (fr = 0) or (vt = 0) then exit;    result := glCreateProgram();    glAttachShader(result, vt);    glAttachShader(result, fr);    glBindFragDataLocation(result, 0, 'FragColor');    glLinkProgram(result);    glDeleteShader(vt);    glDeleteShader(fr);    GetError(1,'initX');    glGetError(); //<- ignore proior errors end; procedure LoadBufferData (isInit: boolean);const    kATTRIB_POINT = 0;    kATTRIB_COLOR = 1;var   verts: array[0..2] of TAAPLVertex;begin  verts[0].position[0] := gOffsetXY[1] + gSize;  verts[0].position[1] := gOffsetXY[2] - gSize;  verts[0].color[0] := 1;  verts[0].color[1] := 0;  verts[0].color[2] := 0;  verts[1].position[0] := gOffsetXY[1] - gSize;  verts[1].position[1] := gOffsetXY[2] - gSize;  verts[1].color[0] := 0;  verts[1].color[1] := 1;  verts[1].color[2] := 0;  verts[2].position[0] := gOffsetXY[1];  verts[2].position[1] := gOffsetXY[2] + gSize;  verts[2].color[0] := 0;  verts[2].color[1] := 0;  verts[2].color[2] := 2;  if (not isInit) then begin     glBindBuffer(GL_ARRAY_BUFFER, gShader.vbo_point);     glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(verts), @verts[0]);     glBindBuffer(GL_ARRAY_BUFFER, 0);     exit;  end;  glGenBuffers(1, @gShader.vbo_point);  glBindBuffer(GL_ARRAY_BUFFER, gShader.vbo_point);  glBufferData(GL_ARRAY_BUFFER, sizeof(verts), @verts[0], GL_STATIC_DRAW);  glBindBuffer(GL_ARRAY_BUFFER, 0);  // Prepare vertrex array object (VAO)  //   glGenVertexArrays intoduced with OpenGL 3.0  glGenVertexArrays(1, @gShader.vao_point);  glBindVertexArray(gShader.vao_point);  glBindBuffer(GL_ARRAY_BUFFER, gShader.vbo_point);  glVertexAttribPointer(kATTRIB_POINT, 2, GL_FLOAT, GL_FALSE, 5*4, PChar(0));  glEnableVertexAttribArray(kATTRIB_POINT);  glVertexAttribPointer(kATTRIB_COLOR, 3, GL_FLOAT, GL_FALSE, 5*4, PChar(sizeof(single)*2));  glEnableVertexAttribArray(kATTRIB_COLOR);  glBindBuffer(GL_ARRAY_BUFFER, 0);  glBindVertexArray(0);  gShader.uniform_viewportSize := glGetUniformLocation(gShader.shaderProgram, pAnsiChar('viewportSize'));end;{$ENDIF} procedure MyGlutInit(ParseCmdLine: Boolean);            // у меня уже создана, скопируюvar  Cmd: array of PChar;  CmdCount, i: Integer;begin  if ParseCmdLine then     CmdCount := ParamCount + 1  else    CmdCount := 1;  SetLength(Cmd, CmdCount);  for i := 0 to CmdCount - 1 do    Cmd[i] := PChar(ParamStr(i));  GlutInit(@CmdCount, @Cmd);end; procedure MyDrawScene; cdecl;{$IfnDef CORE_GL}var  i, j: Integer;{$EndIf}begin  {$IfnDef CORE_GL}  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  glLoadIdentity;  glColor3f(0, 0, 0);  for i := 1 to 250000 do  begin    j := Random(3) + 1;    p[1] := (p[1] + vertices[j, 1]) / 2;    p[2] := (p[2] + vertices[j, 2]) / 2;    glBegin(GL_POINTS);      glVertex2fv(@p);    glEnd;  end;  {$Else}  LoadBufferData(false);  glClearColor(0.0, 0.0, 0.7, 1.0); //Set blue background  glClear(GL_COLOR_BUFFER_BIT);  glDisable(GL_DEPTH_TEST);  glUseProgram(gShader.shaderProgram);  glUniform2f(gShader.uniform_viewportSize, AppWidth, AppHeight);  glBindVertexArray(gShader.vao_point);  glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);  glBindVertexArray(0);   glUseProgram(0);  {$ENDIF}  glutSwapBuffers;end; procedure MyResizeScene(width, height: Integer); cdecl;begin  if height = 0 then height := 1;  glViewport(0, 0, width, height);  glMatrixMode(GL_PROJECTION);  glLoadIdentity;  gluOrtho2D(0, width, 0, height);//  gluPerspective(45, width / height, 0.1, 1000);  glMatrixMode(GL_MODELVIEW);  glLoadIdentity;end; procedure GLKeyboard(Key: Byte; x, y: LongInt); cdecl;begin  if Key =  27 then halt(0);end; var  ScreenWidth, ScreenHeight: Integer;begin  {$IfDef MacOSAll}          // для MacOS вручную прописываем путь, куда установили FreeGlut          // for MacOS, manually write the path where FreeGlut was installed  LoadFreeGlut(LoadLibrary('/usr/local/Cellar/freeglut/3.2.1/lib/libglut.dylib'));          // у меня был путь "/usr/local/Cellar/freeglut/3.2.1" оставшуюся часть          // надо добавить (не знаю, может у кого другой путь будет)  !!! "lib/libglut.dylib" !!!!  {$EndIf}  Randomize;  MyGlutInit(True);  glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);  glutInitWindowSize(AppWidth, AppHeight);  ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);  ScreenHeight :=  glutGet(GLUT_SCREEN_HEIGHT);  glutInitWindowPosition((ScreenWidth - AppWidth) div 2, (ScreenHeight - AppHeight) div 2);   // запрос контекста!!! В Glut нет.  // context request!!! In Glut no.  {$IfDef CORE_GL}  glutInitContextProfile(GLUT_CORE_PROFILE);  glutInitContextVersion(3, 3);  {$Else}  glutInitContextProfile(GLUT_CORE_PROFILE);  glutInitContextVersion(2, 1);  {$EndIf}   glutCreateWindow('OpenGL - Glut');  {$IfDef CORE_GL}  Load_GL_version_3_3_CORE();  gShader.shaderProgram :=  initVertFrag(kVert,  kFrag);  LoadBufferData(true);  {$EndIf}  glClearColor(0.18, 0.20, 0.66, 0);  glutDisplayFunc(@MyDrawScene);  glutReshapeFunc(@MyResizeScene);  glutKeyboardFunc(@GLKeyboard);   glutMainLoop;end. Пример для проверки. Меняйте дефайн в начале.

An example to check. Change the define at the beginning.

Seenkao:
Оставлю здесь, может пригодится кому для информации.

FreeGlut + WinAPI:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program GLUT_non_LCL; {$mode objfpc}{$H+} uses  sysutils, windows,  GL, glu, FreeGlut, Glut;//  newGlut;     use FreeGlut, Glut const  AppWidth  = 800;  AppHeight = 600;   // мышь  MB_LEFT   = 1;  MB_RIGHT  = 2;  MB_MIDDLE = 4; type  XYZ_Col = record    X, Y, Z: Single;    R, G, B: Single;  end; var  ScreenWidth, ScreenHeight: Integer;  point: array[0..3] of XYZ_Col;  angle: array [0..2] of Single;  MB_Down, MB_Up: Byte;   mouseX, mouseY: Integer;  myTimeUse: Integer = 1;  KeyDown: array[0..255] of Boolean;   winOn: Boolean = False;  oldFPS, newFPS, maxFPS: Single;  Z: Integer = 0; procedure glutInitPascal(ParseCmdLine: Boolean);var  Cmd: array of PChar;  CmdCount, I: Integer;begin  if ParseCmdLine then    CmdCount := ParamCount + 1  else    CmdCount := 1;  SetLength(Cmd, CmdCount);  for I := 0 to CmdCount - 1 do    Cmd[I] := PChar(ParamStr(I));  glutInit(@CmdCount, @Cmd);   // ------------------------------------  point[0].X := 0;  point[0].Y := 1;  point[0].Z := 0;  point[0].R := 1;  point[0].G := 0;  point[0].B := 0;   point[1].X := - 0.8;  point[1].Y := - 0.5;  point[1].Z := 0.5;  point[1].R := 0;  point[1].G := 1;  point[1].B := 0;   point[2].X := 0.8;  point[2].Y := - 0.5;  point[2].Z := 0.5;  point[2].R := 0;  point[2].G := 0;  point[2].B := 1;   point[3].X := 0;  point[3].Y := - 0.5;  point[3].Z := - 0.8;  point[3].R := 0.7;  point[3].G := 0;  point[3].B := 0.7;   angle[0] := 50;  angle[1] := 3;  angle[2] := 236;  // ------------------------------------  glutGameModeString('800x600:16@60');   // обратить особое внимание! Это запрос полноэкранного режима, существует он или нет.                                      // В Linux не надо прописывать :16@60 - оно там не работает для FreeGlutend; procedure DrawGL; cdecl;begin  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  glLoadIdentity;   glTranslatef(0, 0, - 3);   glRotatef(angle[0], 1, 0, 0);  glRotatef(angle[1], 0, 1, 0);//  glRotatef(angle[2], 0, 0, 1);   glBegin(GL_TRIANGLES);    glColor3f(point[0].R, point[0].G, point[0].B);    glVertex3f(point[0].X, point[0].Y, point[0].Z);    glColor3f(point[1].R, point[1].G, point[1].B);    glVertex3f(point[1].X, point[1].Y, point[1].Z);    glColor3f(point[2].R, point[2].G, point[2].B);    glVertex3f(point[2].X, point[2].Y, point[2].Z);     glColor3f(point[3].R, point[3].G, point[3].B);    glVertex3f(point[3].X, point[3].Y, point[3].Z);    glColor3f(point[1].R, point[1].G, point[1].B);    glVertex3f(point[1].X, point[1].Y, point[1].Z);    glColor3f(point[2].R, point[2].G, point[2].B);    glVertex3f(point[2].X, point[2].Y, point[2].Z);     glColor3f(point[0].R, point[0].G, point[0].B);    glVertex3f(point[0].X, point[0].Y, point[0].Z);    glColor3f(point[3].R, point[3].G, point[3].B);    glVertex3f(point[3].X, point[3].Y, point[3].Z);    glColor3f(point[2].R, point[2].G, point[2].B);    glVertex3f(point[2].X, point[2].Y, point[2].Z);     glColor3f(point[0].R, point[0].G, point[0].B);    glVertex3f(point[0].X, point[0].Y, point[0].Z);    glColor3f(point[1].R, point[1].G, point[1].B);    glVertex3f(point[1].X, point[1].Y, point[1].Z);    glColor3f(point[3].R, point[3].G, point[3].B);    glVertex3f(point[3].X, point[3].Y, point[3].Z);  glEnd;   glutSwapBuffers;end; procedure ReSizeGLScene(Width, Height: Integer); cdecl;begin  if Height = 0 then    Height := 1;   glViewport(0, 0, Width, Height);  glMatrixMode(GL_PROJECTION);  glLoadIdentity;  gluPerspective(45, Width / Height, 0.1, 1000);   glMatrixMode(GL_MODELVIEW);  glLoadIdentity;end; // обработка клавиатуры, нажатие!!!!    keyboard down!!!procedure GLKeyboard(Key: Byte; X, Y: LongInt); cdecl;begin  inc(z);  if Key = 27 then//    glutLeaveMainLoop;    winOn := False;                   // закрываем если Escape (close)  if (key = 119) {and (not KeyDown[Key])} then  begin    myTimeUse := myTimeUse + 10;    if myTimeUse > 200 then myTimeUse := 200;   end;  if (key = 115) and (not KeyDown[Key]) then  begin     if myTimeUse < 20 then      myTimeUse := myTimeUse - 3    else      myTimeUse := myTimeUse - 10;    if myTimeUse < 1 then myTimeUse := 1;  end;  KeyDown[key] := true;//  glutSetWindowTitle(PChar('time: ' + IntToStr(myTimeUse)));  glutSetWindowTitle(Pchar(IntToStr(z)));end; // обработка отпускания клавиши    keyboard up!!!procedure GLKeyboardUp(Key: Byte; X, Y: LongInt); cdecl;begin  KeyDown[key] := False;end; // обработка специальных клавиш, нажатие!!!!   spec keyboard down (F1, F2 ... )procedure GLSpecKeyboard(Key, X, Y: LongInt); cdecl;begin end; // обработка отпускания специальных клавиш    spec keyboard upprocedure GLSpecKeyboardUp(Key, X, Y: LongInt); cdecl;begin end; // закрываем окно    close windowprocedure ClozeGL; cdecl;begin  winOn := False;//  glutLeaveMainLoopend; // таймер основного процесса, возможно нужен таймер для прорисовки???procedure MyTimerGL(value: Integer); cdecl;var  i: Integer;begin  if (MB_Down and MB_LEFT) > 0 then  ;   if (MB_Down and MB_LEFT) > 0 then ;   angle[0] := angle[0] + 0.5;  if angle[0] > 360 then angle[0] := 0;  angle[1] := angle[1] + 0.5;  if angle[1] > 360 then angle[1] := 0;  angle[2] := angle[2] + 0.5;  if angle[2] > 360 then angle[2] := 0;   if newFPS > (oldFPS + maxFPS) then  begin    glutPostRedisplay;    oldFPS := oldFPS + maxFPS;  end;   glutTimerFunc(myTimeUse, @MyTimerGL, value);          // создать структуру таймеров.  newFPS := newFPS + myTimeUse;end; // обработка мыши       mouse (left, right, middle) down/upprocedure MouseGL(button, state, X, Y: Integer); cdecl;var  n: Byte;begin  n := button;   if state = GLUT_UP then    begin     if button = GLUT_LEFT_BUTTON then     begin       MB_Down := MB_Down and (255 - MB_LEFT);       MB_Up := MB_Up or MB_LEFT;     end;     if button = GLUT_RIGHT_BUTTON then     begin       MB_Down := MB_Down and (255 - MB_RIGHT);       MB_Up := MB_Up or MB_RIGHT;     end;     if button = GLUT_MIDDLE_BUTTON then     begin       MB_Down := MB_Down and (255 - MB_MIDDLE);       MB_Up := MB_Up or MB_MIDDLE;     end;     KeyDown[n] := false;               // клавиши с минимальным кодом всё равно не используются, используем пространство для мыши    end;   if state = GLUT_DOWN then  begin   if button = GLUT_LEFT_BUTTON then   begin     MB_Down := MB_Down or MB_LEFT;     MB_Up := MB_Up and (255 - MB_LEFT);   end;   if button = GLUT_RIGHT_BUTTON then   begin     MB_Down := MB_Down or MB_RIGHT;     MB_Up := MB_Up and (255 - MB_RIGHT);   end;   if button = GLUT_MIDDLE_BUTTON then   begin     MB_Down := MB_Down or MB_MIDDLE;     MB_Up := MB_Up and (255 - MB_MIDDLE);   end;   KeyDown[n] := true;  end;   mouseX := X;  mouseY := Y;end; // ролик мыши     mouse wheelprocedure MouseWheelGL(wheel, dir, X, Y: Integer); cdecl;begin end; var  win00: Integer;  myWND: HWND;begin  glutInitPascal(true);  glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);  glutInitWindowSize(AppWidth, AppHeight);       //----------------------------------------  glutInitContextVersion(2, 1);  glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);       //----------------------------------------  ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);  ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);  glutInitWindowPosition((ScreenWidth - AppWidth) div 2, (ScreenHeight - AppHeight) div 2);  win00 := glutCreateWindow('OpenGL testing mouse and keyboard.');   // хендл окна  myWND := WindowFromDC(wglGetCurrentDC);   // устанавливаем стиль окна   window style, disable window resizing  SetWindowLongPtr(myWND, GWL_STYLE, WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE);  // устанавливаем размеры окна.   without this, the window is larger than the initially specified  SetWindowPos(myWND, HWND_TOPMOST, (ScreenWidth - AppWidth) div 2, (ScreenHeight - AppHeight) div 2, AppWidth, AppHeight, SWP_NOACTIVATE);   glClearColor(0.48, 0.6, 0.86, 1.0); // initializing  glutDisplayFunc(@DrawGL);  glutReshapeFunc(@ResizeGLScene);  glutKeyboardFunc(@GLKeyboard);  glutKeyboardUpFunc(@GLKeyboardUp);  glutCloseFunc(@ClozeGL);  glutMouseFunc(@MouseGL);  glutMouseWheelFunc(@MouseWheelGL);  glutSpecialFunc(@GLSpecKeyboard);  glutSpecialUpFunc(@GLSpecKeyboardUp);   glClearDepth(1.0);  glDepthFunc(GL_LESS);  glEnable(GL_DEPTH_TEST);   oldFPS := 0;  newFPS := 0;  maxFPS := 1000 / 60;  winOn := True;   if glutGameModeGet(GLUT_GAME_MODE_POSSIBLE) = 1 then    // а здесь, мы проверяем существует ли запрошенный в начале программы    glutTimerFunc(50, @MyTimerGL, 0);                      // режим (800х600), и включаем таймер, если режим существует   while winOn do  begin    glutMainLoopEvent;    inc(z);  end;  glutLeaveMainLoop;      // disable window processes  glutDestroyWindow(win00);    // we destroy the window manuallyend.

Alextp:
>куда обратиться, чтоб в FreePascal(Lazarus), вместо Glut сделали указание на FreeGlut

Какое указание, где? в каком-то юните стоит какая-то загрузка Glut? Почему не юзать не этот модуль а модуль FreeGlut?
Где именно место в LCL где грузится "плохая либа"?

Seenkao:
Alextp, при установке Lazarus - GLUT установлено изначально, и ни какими средствами вы не заставите использовать FreeGlut, пока не установите FreeGlut на систему. Но, после установки, обращаться (почему-то) многое будет всё равно к изначальным библиотекам GLUT, вместо того чтоб было прописано использовать FreeGlut (не считая Linux, там просто подменяется библиотека).

google translate:
Alextp, when installing Lazarus - GLUT is preinstalled, and by no means can you force FreeGlut to be used until FreeGlut is installed on the system. But, after installation, (for some reason) a lot will still refer to the original GLUT libraries, instead of using FreeGlut (apart from Linux, the library is simply replaced there).


--- Quote from: Alextp on October 17, 2020, 10:43:11 am ---Где именно место в LCL где грузится "плохая либа"?
--- End quote ---
Извиняюсь, что?

Тут не идёт речи об LCL. Изначально вы ни какими методами не заставите FreeGlut работать с LCL. Последний код, может поможет, там есть возможность подмены окна средствами WinAPI на другое созданное окно (удалять потом надо будет оба окна или сразу удалять окно, как только подменили его). Используйте для этого SetWindowLongPtr (в Windows).

google translate:
Sorry, what?

There is no question of LCL here. Initially, you will not force FreeGlut to work with LCL by any means. The last code may help, there is a possibility of replacing a window using WinAPI to another created window (then you will have to delete both windows or immediately delete as soon as the window was replaced). Use SetWindowLongPtr for this (on Windows).

Alextp:
>Но, после установки, обращаться (почему-то) многое будет всё равно к изначальным библиотекам GLUT, вместо того чтоб было прописано использовать FreeGlut

Только скажу что обычно делают так- в сорцах Laz/FPC ищут привязки к либам (GLUT). Это может быть что-то типа константы lib_gl='libglut.so.1' (в винде .dll, в Мак .dylib), это надо найти и уже там делать патч - грузить через "dlopen" уже не эту либу а например 'libfreeglut.so'..

Navigation

[0] Message Index

[#] Next page

Go to full version