Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблемы загрузки OpenGL glGenBuffers в Delphi на Windows: поиск решения

Delphi , Графика и Игры , OpenGL

Заголовок: Решение проблемы загрузки OpenGL glGenBuffers в Delphi на Windows

Вопрос: Почему следующий код не может загрузить OpenGL-метод glGenBuffers и как это исправить?

Код:

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  StrUtils, SysUtils, Windows;

var
  Library_OpenGL: HMODULE;

begin
  try
    Library_OpenGL := LoadLibrary('opengl32.dll');
    Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil, ' glGenBuffers Success', ' glGenBuffers Failed'));
    Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffersARB') <> nil, ' glGenBuffersARB Success', ' glGenBuffersARB Failed'));
    FreeLibrary(Library_OpenGL);

    Library_OpenGL := LoadLibrary('atioglxx.dll'); // ATI 4850
    Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil, ' glGenBuffers Success', ' glGenBuffers Failed'));
    Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffersARB') <> nil, ' glGenBuffersARB Success', ' glGenBuffersARB Failed'));
    FreeLibrary(Library_OpenGL);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.

Ответ:

Проблема в том, что библиотека OpenGL не экспортирует функцию glGenBuffers. Чтобы загрузить эту функцию, нам нужно использовать wglGetProcAddress, но для этого требуется контекст рендеринга.

Вот пример кода, который успешно загружает функцию glGenBuffers:

uses
  opengl;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Library_OpenGL: HMODULE;
  DC: HDC;
  PxFmt: TPixelFormatDescriptor;
  GLRC: HGLRC;
  glGenBuffers: procedure(n: GLsizei; buffers: PGLuint); cdecl;

begin
  Library_OpenGL := LoadLibrary('opengl32.dll');

  DC := GetDC(Handle);
  ZeroMemory(@PxFmt, SizeOf(PxFmt));
  PxFmt.nSize := SizeOf(PxFmt);
  PxFmt.nVersion := 1;
  PxFmt.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  PxFmt.iPixelType := PFD_TYPE_RGBA;
  PxFmt.cColorBits := 32;
  PxFmt.cDepthBits := 24;
  PxFmt.cStencilBits := 8;
  SetPixelFormat(DC, ChoosePixelFormat(DC, @PxFmt), @PxFmt);

  GLRC := wglCreateContext(DC);
  wglMakeCurrent(DC, GLRC);
  @glGenBuffers := wglGetProcAddress('glGenBuffers');
  Assert(@glGenBuffers <> nil);
  ...
end;

Альтернативный ответ:

В более новых версиях Delphi (например, XE6 и выше) есть единица OpenGLExt, которая включает функциональность OpenGL 4.3, в том числе glGenBuffers. Чтобы использовать эту единицу, вам нужно явно вызвать InitOpenGLext, который делает несколько вызовов wglGetProcAddress.

Вот пример кода, который использует GLFW вместе с единицами OpenGL и OpenGLExt:

uses Winapi.OpenGL, Winapi.OpenGLExt,
  glfw; //The glfw unit name may be different, depending where you obtained it.

var
  window: pGLFWwindow;

begin
  glfwInit; //Returns 0 if it fails.
  window := glfwCreateWindow(640, 480, pchar(utf8encode('My Test Window')),
    nil, nil); //Returns nil if it fails.
  glfwMakeContextCurrent(window);

  // Next line assigns function pointers for extension functions, so glGenBuffers will work.
  InitOpenGLext;

  // Add any other setup and your rendering loop here, and clean up after the loop.
  // ...
end;

Примечание: Обязательно добавьте ошибки проверки в свой код и убедитесь, что вы правильно очищаете ресурсы после завершения работы.

Создано по материалам из источника по ссылке.

Пользователь спрашивает о решении проблемы загрузки OpenGL glGenBuffers в Delphi на Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: OpenGL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 18:51:25/0.0035760402679443/0