如何在Windows上的Delphi中加载OpenGL glGenBuffers方法?

SOU*_*ser 2 delphi opengl

以下代码尝试加载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.
Run Code Online (Sandbox Code Playgroud)

Ser*_*yuz 8

如果我们正确地检查API的返回,而不是在它失败时转储,我们得到它失败的原因的答案.

更换

Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil, ' glGenBuffers Success', ' glGenBuffers Failed'));
Run Code Online (Sandbox Code Playgroud)

同

Win32Check(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil);
Run Code Online (Sandbox Code Playgroud)

我们有一个例外:

EOSError:系统错误.代码:127
.找不到指定的程序

因此GetProcAddress失败的原因是opengl库不导出glGenBuffers函数."依赖"检查确认了这一点.


快速搜索opengl中缺少的函数会导致我们wglGetProcAddress:

该wglGetProcAddress函数返回与当前的OpenGL渲染上下文使用OpenGL扩展函数的地址.

如果你仔细阅读文档,你会发现只是调用gwlGetProcAddress提供glGenBuffers将失败.您需要一个渲染上下文来返回函数的地址.

下面是我获得函数地址的最短项目.它使用GUI应用程序,因为渲染上下文需要一个窗口,默认的VCL表单符合要求(参见"备注" SetPixelFormat).(免责声明:我对opengl一无所知,下面的代码不一定正确,它也省略了你应该真正避免的错误检查).

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;
Run Code Online (Sandbox Code Playgroud)