加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

在Windows上使用OpenGL扩展

发布时间:2020-12-13 20:55:04 所属栏目:Windows 来源:网络整理
导读:我想使用OpenGL扩展下暴露的功能。我在Windows上,该怎么做? 简单的解决方案:使用 GLEW.查看 here。 硬解决方案: 如果你有一个非常强的理由不使用GLEW,这里是如何实现相同的没有它: 识别您希望使用的OpenGL扩展和扩展API。 OpenGL扩展在OpenGL Extensio
我想使用OpenGL扩展下暴露的功能。我在Windows上,该怎么做?
简单的解决方案:使用 GLEW.查看 here。

硬解决方案:
如果你有一个非常强的理由不使用GLEW,这里是如何实现相同的没有它:

识别您希望使用的OpenGL扩展和扩展API。 OpenGL扩展在OpenGL Extension Registry中列出。

Example: I wish to use the capabilities of the 07003 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 07004 webpage and find that the 07005 extension is supported. I then download the latest 07006 and install it.

您的图形卡制造商提供了一个glext.h头文件(或类似的命名头文件),其中包含使用支持的OpenGL扩展所需的所有声明。 (请注意,并不是所有的扩展名都可能被支持。)将这个头文件放在某个地方,你的编译器可以把它或者把它的目录包含在编译器的include目录列表中。

添加#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 by Dave Astle – 这篇文章有点过时了,但是您需要了解所有的信息,以了解为什么Windows可能存在这种可疑情况以及如何解决这个问题。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读