Windows中的OpenGL雾坐标扩展

时间:2013-03-28 15:08:59

标签: opengl

我尝试在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特定的函数调用。谁能告诉我它是如何工作的?

1 个答案:

答案 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。它将返回一个有效的函数指针是可用的,但这并不一定意味着你需要的功能(这就是你应该检查扩展字符串的原因)。这种情况很少见,但可能由于扩展交互而发生。