gpt4 book ai didi

opengl - 在 Windows 上使用 OpenGL 扩展

转载 作者:行者123 更新时间:2023-12-03 14:47:42 24 4
gpt4 key购买 nike

我想使用 OpenGL 扩展下公开的函数。我在 Windows 上,我该怎么做?

最佳答案

简单的解决方案 : 使用 GLEW .看看如何 here .

硬解 :
如果您有 真强的理由不使用 GLEW,这里是如何在没有它的情况下实现相同的目标:

确定您希望使用的 OpenGL 扩展和扩展 API。 OpenGL 扩展列在 OpenGL Extension Registry 中.

Example: I wish to use the capabilities of the EXT_framebuffer_object extension. The APIs I wish to use from this extension are:


glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

检查您的图形卡是否支持您要使用的扩展。如果是这样,那么您的工作就快完成了!为您的显卡下载并安装最新的驱动程序和 SDK。

Example: The graphics card in my PC is a NVIDIA 6600 GT. So, I visit the NVIDIA OpenGL Extension Specifications webpage and find that the EXT_framebuffer_object extension is supported. I then download the latest NVIDIA OpenGL SDK and install it.



您的显卡制造商提供了 glext.h 包含使用支持的 OpenGL 扩展所需的所有声明的头文件(或类似名称的头文件)。 (请注意,并非所有扩展都可能受支持。)要么将此头文件放在编译器可以选取的位置,要么将其目录包含在编译器的包含目录列表中。

添加 #include <glext.h>代码中的行以将头文件包含到代码中。

开通 glext.h ,找到您要使用的 API 并获取其相应的丑陋声明。

Example: I search for the above framebuffer APIs and find their corresponding ugly-looking declarations:


typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);

所有这一切意味着您的头文件具有 2 种形式的 API 声明。一种是类似 wgl 的丑陋函数指针声明。另一个是看起来很正常的函数声明。

对于您希望使用的每个扩展 API,将函数名称的代码声明添加为一种难看的字符串类型。

Example:


PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;

虽然看起来很难看,但我们所做的只是声明与扩展 API 对应的类型的函数指针。

用它们的合法函数初始化这些函数指针。这些函数由库或驱动程序公开。我们需要使用 wglGetProcAddress() 功能来做到这一点。

Example:


glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");

不要忘记检查函数指针是否为 NULL。如果偶然 wglGetProcAddress() 找不到扩展函数,它会用 NULL 初始化指针。

Example:


if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT
|| NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT)
{
// Extension functions not loaded!
exit(1);
}

就是这样,我们完成了!您现在可以使用这些函数指针,就像存在函数调用一样。

Example:


glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0);

引用: Moving Beyond OpenGL 1.1 for Windows作者:Dave ASTLe — 这篇文章有点过时,但包含了您需要了解为什么 Windows 上存在这种可悲情况以及如何解决它所需的所有信息。

关于opengl - 在 Windows 上使用 OpenGL 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com