我编写了一个使用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_context
和WGL_ARB_pixel_format
)。创建两个不同的上下文时,不能保证在Windows上获得相同的ICD实现。这就是创建GLEW MX的原因。
现在,我怀疑在您的情况下发生的事情实际上不是您正在获得两个不同的ICD(在现实世界中极为罕见),而是实际上您创建的第一个上下文是兼容性概要文件,而第二个是核心轮廓。
GLEW使用扩展字符串初始化变量,例如GLEW_ARB_texture_storage
,但是在核心配置文件中,GLEW不够聪明,无法以正确的方式解析该字符串(多次调用glGetStringi (...)
)。这就是为什么必须使用GLEW_EXPERIMENTAL
的原因。GLEW_EXPERIMNETAL
告诉GLEW尝试为它知道的每个扩展加载每个函数指针,而无需首先解析任何扩展字符串以检查可用性。这在核心配置文件中是必不可少的,但在兼容性上却不是(因为旧的扩展字符串机制在兼容性上仍然有效)。 GLEW依赖解析扩展字符串的任何部分在核心配置文件中均无法正常工作。