我编写了一个使用glew初始化OpenGL上下文的DLL。首先,我创建了一个虚拟窗口以创建适当的上下文。其次,创建最终的上下文和窗口。
glewInit()函数调用成功,并且某些布尔变量(例如GLEW_ARB_texture_storage)设置为1(我有一个与opengl 3.3兼容的视频适配器)。

注意

glewExperimental=GL_TRUE


虽然。

但是,当我使用上面的DLL编写客户端程序时,相同的GLEW_ARB_texture_storage变量等于GL_FALSE

因此,我想知道glewInit()应该在哪里最终被调用?
从DLL调用它似乎还不够。我还应该从客户端程序端调用它吗?

最佳答案

实际上,我不会从您的虚拟上下文中初始化GLEW。考虑手动加载一个或两个您需要手工创建最终上下文的扩展名(例如WGL_ARB_create_contextWGL_ARB_pixel_format)。创建两个不同的上下文时,不能保证在Windows上获得相同的ICD实现。这就是创建GLEW MX的原因。

现在,我怀疑在您的情况下发生的事情实际上不是您正在获得两个不同的ICD(在现实世界中极为罕见),而是实际上您创建的第一个上下文是兼容性概要文件,而第二个是核心轮廓。

GLEW使用扩展字符串初始化变量,例如GLEW_ARB_texture_storage,但是在核心配置文件中,GLEW不够聪明,无法以正确的方式解析该字符串(多次调用glGetStringi (...))。这就是为什么必须使用GLEW_EXPERIMENTAL的原因。

GLEW_EXPERIMNETAL告诉GLEW尝试为它知道的每个扩展加载每个函数指针,而无需首先解析任何扩展字符串以检查可用性。这在核心配置文件中是必不可少的,但在兼容性上却不是(因为旧的扩展字符串机制在兼容性上仍然有效)。 GLEW依赖解析扩展字符串的任何部分在核心配置文件中均无法正常工作。

08-19 13:04