Windows OpenGL 1.1函数的wglGetProcAddress

Windows OpenGL 1.1函数的wglGetProcAddress,windows,opengl,Windows,Opengl,OpenGL网站上的此wiki页面声称OpenGL 1.1函数不应通过wglGetProcAddress加载,并且该措辞似乎暗示,如果您尝试以下操作,某些系统在设计上将返回NULL: (其想法是只有1.2+个函数值得通过wglGetProcAddress加载) 该页面没有告诉我们是谁报告了1.1函数上的这些失败wglGetProcAddress调用,这是我个人从未见过的。谷歌搜索也几乎没有关于这个问题的信息 wglGetProcAddress()是否会为足够多的用户返回1.1函数的NULL,这

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

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

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

wglGetProcAddress()是否会为足够多的用户返回1.1函数的NULL,这样我才真正关心呢?或者,它只是失败的选择几个不幸的用户与真正破碎的GPU驱动程序(在这种情况下,我不太在乎)


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

你应该问自己,这对你来说是否重要,你是否应该关心

手动加载OpenGL 1.1函数意味着您必须使用不同的函数名,否则它们将与
gl/gl.h
中的声明冲突。或者,您必须定义
GL\u NO\u原型
,但在这种情况下,您也将没有OpenGL 1.0功能。
因此,在任何情况下,这样做都意味着额外的麻烦,没有任何好处,您可以简单地使用1.1功能而不做任何事情

话虽如此,我试过一次,因为我认为动态加载所有内容是一个很有创意的想法(当我清醒过来时,我想知道是什么让我产生了这个想法),我可以确认它不适用于nVidia驱动程序(或者至少两年前不适用于nVidia驱动程序)。

但是,仔细想想,完全有理由,甚至是一件好事,一些没有意义的东西不起作用。

我在技术上回答了这个问题,但是:

wglGetProcAddress()是否会为足够多的用户返回1.1函数的NULL,这样我才真正关心呢


它将为所有用户返回NULL。我已经在NVIDIA和ATI平台(最新的驱动程序和DX10硬件)上试用过。所有这些平台都能做到。

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