【问题标题】:wglGetProcAddress for OpenGL 1.1 functionsOpenGL 1.1 函数的 wglGetProcAddress
【发布时间】:2011-08-06 12:30:52
【问题描述】:

OpenGL 网站上的此 wiki 页面声称不应通过 wglGetProcAddress 加载 OpenGL 1.1 函数,并且措辞似乎暗示如果您尝试某些系统将在设计上返回 NULL:

http://www.opengl.org/wiki/Platform_specifics:_Windows#wglGetProcAddress

(想法是只有 1.2+ 的函数值得通过 wglGetProcAddress 加载)。

该页面没有告诉我们谁报告了这些失败的 wglGetProcAddress 调用 1.1 函数,这是我个人从未见过的。谷歌搜索也几乎没有关于这个问题的信息。

wglGetProcAddress() 是否会为足够多的用户返回 NULL 的 1.1 函数,以至于我应该真正关心?或者它只是为少数不幸的用户而失败,这些用户的 GPU 驱动程序真的坏了(在这种情况下,我不太在意)。

还有其他人遇到过这个吗?

【问题讨论】:

    标签: windows opengl


    【解决方案1】:

    您应该问自己的问题是它对您是否重要以及您是否应该关心。

    手动加载 OpenGL 1.1 函数意味着您必须使用不同的函数名称,否则它们将与 gl/gl.h 中的声明发生冲突。或者,您必须定义 GL_NO_PROTOTYPES,但在这种情况下,您将没有 OpenGL 1.0 功能。
    所以,在任何情况下,这样做都意味着额外的麻烦,没有任何收获,你可以简单地使用 1.1 的功能而无需做任何事情。

    话虽如此,我已经尝试过一次,因为我认为动态加载所有内容是一个巧妙的想法(当我清醒过来时,我想知道是什么让我产生了这个想法),我可以确认它不能(或至少,2 年前不能)与 nVidia 驱动程序一起使用。
    不过,仔细想想,这完全有道理,甚至是一件好事,没有意义的事情不起作用。

    【讨论】:

    • 是的,这对我来说很重要,我应该关心。 “......动态加载所有内容的想法”是什么意思。那里的“一切”到底指的是什么?不,我不明白这是怎么回事。无论如何,您已经必须动态加载 1.2+ 函数,因此您基于 OpenGL 注册表中的 gl.spec 文件编写的任何综合函数加载器代码也将要加载 1.1 函数。不得不停止它加载 1.1 调用感觉就像它值得一个很好的详细技术解释,无论我在网上搜索多少,我都找不到。
    • 技术解释是,直到 1.3 版(包括 1.3 版)在内的所有内容都被视为“核心、无处不在”,并包含在 gl.h 中。几十年来,1.3 版以外的所有内容都被视为“扩展,当然不支持”,并且位于 glext.h 中。除了在 Windows 下,由于除了 Microsoft 的某些人之外没有人可以解释的原因,它也将 1.2 和 1.3 版本的功能视为“未知之地”。
    • 关于基于gl.spec的综合加载器,祝您努力。我已经写了这样的东西,并且可以向你保证它一点也不好玩(除非你有一个非常好的理由,考虑到有 GLEW,这甚至不是一个好主意,正常工作)。这样的加载器当然应该只加载有意义的东西,而不是做很多额外的工作来痛苦地重新实现已经开箱即用的东西。
    • @Nicol Bolas:关于仅支持 1.1 版的 Windows,请仔细阅读评论(“Windows 下除外”位),这正是我的意思。关于编写自己的加载程序,正如我所指出的,大多数人没有充分的理由不只使用 GLEW。对我来说,30k 将在 init 后再次卸载,而不是 300k 用于正确初始化一组定义良好的功能集(并且在 1ms 内启动)是交易撮合者,更何况 32 位地址空间已成为限制因子(映射大型数据集)之前一次。花了两个月...
    • ... 曾经写过一个规范解析器和代码生成器确实有点贵,但是从我的角度来看,现在的代码是最佳的(兼容,正是我需要的,没有别的,以及轻量级、故障安全和可降级)。而且,它适用于我在未来几年编写的任何程序,因此成本最终会摊销。 (除非 Khronos 将规范迁移到 XML,但这已经很多年没有发生了,所以不太可能很快发生)。
    【解决方案2】:

    我在discussion page of that Wiki article 上从技术上回答了这个问题,但是:

    对于足够多的用户,wglGetProcAddress() 是否会为 1.1 函数返回 NULL,以至于我应该真正关心?

    它将为 所有 用户返回 NULL。我已经在 NVIDIA 和 ATI 平台(最近的驱动程序和 DX10 硬件)上进行了尝试,并且他们都这样做了。

    【讨论】:

    • 我觉得我的记忆力很差。我上次在 Windows 上使用 OpenGL 是在 2 年前,一定是直接使用 GetProcAdress() (当然可以)。我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多