1

我正在通过动态链接与 Windows 预打包的 opengl32.dll 文件来设置基本的 OpenGL 应用程序(该部分是非可选的)。但是,我在获取与顶点缓冲区对象相关的函数的过程地址时遇到了很多困难。

我最初的调查显示,Windows 最初只公开了 OpenGL 1.1 规范,并且需要使用 wglGetProcAddress 调用来获取任何更新的函数。所以我修改了我的代码以尝试该方法。我使用 glGenBuffers 作为我的示例案例,并尝试了四种不同的尝试来加载它,但都失败了。我还使用 glGetString 检查了报告为主要版本 4 的版本号,所以我怀疑它缺乏 VBO 支持。

我应该如何获取这些 VBO 函数的 proc 地址?

我正在处理的代码的最小化示例如下:

#include <iostream>
#include "windows.h"

using namespace std;

int main()
{

//Load openGL and get necessary functions
HINSTANCE hDLL = LoadLibrary("opengl32.dll");
PROC WINAPI(*winglGetProcAddress)(LPCSTR);
void(*genBuffers)(int, unsigned int*);

if(hDLL)
{
    winglGetProcAddress = (PROC WINAPI(*)(LPCSTR))GetProcAddress(hDLL, "wglGetProcAddress");
    if(winglGetProcAddress == NULL){cout << "wglGetProcAddress not found!" << endl; return 0;}

    genBuffers = (void(*)(int, unsigned int*))GetProcAddress(hDLL, "glGenBuffers");
    if(genBuffers == NULL){genBuffers = (void(*)(int, unsigned int*))winglGetProcAddress("glGenBuffers");}
}
else
{cout << "This application requires Open GL support." << endl; return 0;}

//glGenBuffers not supported, fallback to glGenBuffersARB
if(genBuffers == NULL)
{
    genBuffers = (void(*)(int, unsigned int*))GetProcAddress(hDLL, "glGenBuffersARB");
    if(genBuffers == NULL){genBuffers = (void(*)(int, unsigned int*))winglGetProcAddress("glGenBuffersARB");}
    if(genBuffers == NULL)
    {cout << "Could not locate glGenBuffers or glGenBuffersARB in opengl32.dll." << endl; return 0;}
}

//get a Vertex Buffer Object
unsigned int a[1];
genBuffers(1, a);

//cleanup
if(!FreeLibrary(hDLL))
{cout << "Failed to free the opengl32.dll library." << endl;}

return 0;
}

运行时,它会加载库并正确获取 wglGetProcAddress,但随后会输出“无法在 opengl32.dll 中找到 glGenBuffers 或 glGenBuffersARB”。错误,表明它无法使用“GetProcAddress”或“wglGetProcAddress”获取“glGenBuffers”或“glGenBuffersARB”。

或者,如果这确实意味着我没有 VBO 支持,驱动程序更新是否有帮助,或者是否有可能获得支持?我真的不想使用已弃用的立即模式调用。

我在 Windows XP、Intel Core i5 和 NVIDIA GeForce GTX 460 上的 Code::Blocks 中运行它。

4

0 回答 0