0

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

4

1 回答 1

0

在 Microsoft Windows 上,您使用一个库(the .libone)进行编译,并使用不同的库(您.dll的库)运行。Microsoft 控制着编译库的内容,但供应商可以替换运行时库。在 OpenGL 的情况下,编译库相当老了(仅支持 OpenGL 1.1 函数和一些扩展),并且由于该库提供了编译器链接所需的导出函数,因此不包含新的 OpenGL 函数。因此,需要使用函数指针,因为它们可以在运行时从 .dll 中检索。该函数wglGetProcAddress()执行该函数检索,并且您在大写字母中看到的所有这些类型(例如,PFNGLFOGCOORDFEXTPROC)都是您可以使用的函数的类型定义wglGetProcAddress()。因此,为了使用您的glFogCoordfEXT()函数,您需要在调用它之前从 .dll 中检索它。wglGetProcAddress()通常,您应该在程序开始时(但在您创建了 OpenGL 上下文之后)收集所有需要用于获取初始化代码的函数。

另一点:您应该验证适当版本的 OpenGL 是否可用(通过调用glGetString(GL_VERSION),并且支持您可能需要的任何扩展(通过调用glGetString(GL_EXTENSIONS)并解析字符串,或者如果您使用的是更新的 OpenGL,调用glGetStringi()get单独的扩展字符串)。 如果该函数在您的 OpenGL 实现中不可用,将wglGetProcAddress()返回NULL。它将返回一个有效的函数指针可用,但这并不一定意味着您需要的功能存在(这就是为什么您应该检查扩展字符串)。这种情况很少见,但可能由于扩展交互而发生。

于 2013-03-28T16:33:39.243 回答