将OpenGL顶点缓冲区对象与Windows中的动态链接OpenGL一起使用

将OpenGL顶点缓冲区对象与Windows中的动态链接OpenGL一起使用,windows,opengl,dynamic-linking,Windows,Opengl,Dynamic Linking,我正在建立一个基本的OpenGL应用程序,通过动态链接预打包的opengl32.dll文件与Windows,该部分是非可选的。但是,我很难获得与顶点缓冲区对象相关的函数的过程地址 我的初步调查显示,windows最初只公开OpenGL 1.1规范,需要使用wglGetProcAddress调用来获取比这更新的函数。所以我修改了我的代码来尝试这种方法。我使用glGenBuffers作为示例,尝试了四次不同的加载尝试,但都失败了。我还使用了glGetString来检查我的版本号,该版本号报告为主要版

我正在建立一个基本的OpenGL应用程序,通过动态链接预打包的opengl32.dll文件与Windows,该部分是非可选的。但是,我很难获得与顶点缓冲区对象相关的函数的过程地址

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

如何获取这些VBO函数的进程地址

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

#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上以代码::块的形式运行此程序。

此过程非常简单。无论如何,您不应该动态加载opengl32.dll;只需像其他人一样链接到opengl32.lib。这样,您就可以使用,而不必为手动加载函数而烦恼。另外,请注意,该过程从创建OpenGL上下文开始。你不能只加载一个DLL而期望得到函数。@Nicol:在Windows部分关于wglGetProcAddress引用的源代码中,它说这个函数只能在有效的OpenGL上下文中工作,这正是我所需要的。在设置OpenGL上下文之前,我调用了这个方法,但没有意识到这是必要的。非常感谢你,我很感激你的建议,不要动态地做,但这个决定不是我的决定。再次感谢你引导我找到答案。这个决定怎么会不是你的决定呢?如果您的老板/任何人强迫您这样做,请向他们解释,手动加载DLL或使用导入库加载DLL没有任何区别。如果他们不能理解这一点,那就去找一份更好的工作。这是客户的要求之一,原因很多,解释得很糟糕,显然是不可谈判的。到目前为止,手动加载程序并不特别困难,而且只需要一个子集,因此这不是一场值得战斗的战斗。再次感谢您的帮助。到目前为止,手动加载程序并不特别困难,不再是加载程序;您现在正在处理OpenGL。几乎每个OpenGL加载库都需要链接到导入库;这就是几乎每个OpenGL程序的工作原理。这意味着您必须手动加载所有函数指针。作为一个写过一篇文章的人,我只能说,祝你好运。我至少有自动代码生成。