我尝试在Windows下使用OpenGL进行雾坐标扩展。以下是我的代码的前几行:
#include <windows.h>
#include <gl\glut.h>
#include "GLEXT.h"
#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450
#define GL_FOG_COORDINATE_EXT 0x8451
PFNGLFOGCOORDFEXTPROC glFogCoordfEXT = NULL;
glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT");
如果是这样,编译器提示无法找到glFogCoordfEXT。但是一旦我把
glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT");
在雾参数设置之前,编译通过并且程序运行良好。
虽然我经常使用Windows,但我并不熟悉Windows特定的函数调用。谁能告诉我它是如何工作的?
答案 0 :(得分:0)
在Microsoft Windows上,您使用一个库(.lib
一个)进行编译,并使用其他库(您的.dll
库)运行。 Microsoft控制编译库的内容,但供应商能够替换运行时库。在OpenGL的情况下,编译库很老(仅支持OpenGL 1.1函数和一些扩展),并且由于该库提供了编译器链接所需的导出函数,因此不包含新的OpenGL函数。因此,需要使用函数指针,因为它们可以在运行时从.dll中检索。函数wglGetProcAddress()
执行该函数检索,您以大写字母(例如PFNGLFOGCOORDFEXTPROC
)看到的所有类型都是wglGetProcAddress()
可以获得的函数的typedef。因此,为了使用您的glFogCoordfEXT()
函数,您需要在调用之前从.dll中检索它。通常,您应该收集在程序开始时使用wglGetProcAddress()
来获取初始化代码所需的所有函数(但是在创建OpenGL上下文之后)。
另一点:你应该验证适当的OpenGL版本是否可用(通过调用glGetString(GL_VERSION)
,并且支持你可能需要的任何扩展(通过调用glGetString(GL_EXTENSIONS)
并解析字符串,或者如果您使用的是更新的OpenGL,请调用glGetStringi()
以获取单独的扩展字符串。如果您的OpenGL实现中没有该函数,wglGetProcAddress()
将返回NULL
。它将返回一个有效的函数指针是可用的,但这并不一定意味着你需要的功能(这就是你应该检查扩展字符串的原因)。这种情况很少见,但可能由于扩展交互而发生。