OpenGL中glGet获取GL_POLYGON_MODE返回两个值的相关疑问
背景说明
当调用glGetIntegerv(GL_POLYGON_MODE, data)获取多边形光栅化模式时,要求data是长度为2的整数数组,旧文档说明它会返回两个值,分别对应GL_FRONT(存储于data[0])和GL_BACK(存储于data[1])的模式。但从OpenGL 3.2开始,GL_FRONT和GL_BACK这两个PolygonMode的face参数被弃用,多边形统一使用同一模式渲染,调用glPolygonMode时只能用GL_FRONT_AND_BACK作为face参数。
疑问与解答
1. 为何glGet仍为GL_POLYGON_MODE返回两个值?
这是OpenGL向后兼容性设计的结果。OpenGL的核心原则之一是尽量不破坏旧代码的运行逻辑,很多遗留代码依赖glGetIntegerv(GL_POLYGON_MODE)返回两个值的行为,如果修改这个接口的返回格式,会直接导致这些旧代码出现错误甚至崩溃。因此即使前后面分开设置的功能被弃用,glGet的返回格式依然保留了原有设计。
2. 调用glGetIntegerv(GL_POLYGON_MODE, data)时,data[0]是否始终等于data[1]?
在OpenGL 3.2及以后的**核心模式(Core Profile)中,data[0]和data[1]必然相等。因为此时只能通过GL_FRONT_AND_BACK设置统一的多边形模式,前后面的模式被强制同步。不过在兼容模式(Compatibility Profile)**的实现中,可能存在允许通过遗留路径修改前后面模式的情况,此时两者可能不相等,但这种场景已经属于非规范的遗留用法。
3. 截至2024年4月29日,为何在OpenGL4参考页中无法找到GL_POLYGON_MODE的描述?
OpenGL 4的核心模式中,GL_POLYGON_MODE作为单独枚举值的相关功能被整合进了glPolygonMode的文档中,而非单独列出条目。另外,很多OpenGL 4的参考文档更侧重核心模式的新特性,对这类遗留枚举的单独描述做了精简。需要注意的是,glPolygonMode本身并没有被移除,只是它的face参数仅支持GL_FRONT_AND_BACK,相关的模式设置逻辑依然存在,只是文档呈现方式发生了变化。
内容的提问来源于stack exchange,提问作者Weber Lin

