为什么在OpenGL 3.2及以上版本中GL_FRONT和GL_BACK已被弃用?

4
在OpenGL 3.2及以上版本的glPolygonMode中,我无法单独传递GL_FRONT或GL_BACK参数。例如:glPolygonMode(GL_FRONT, GL_LINE);会生成无效枚举:(GL_INVALID_ENUM错误生成。多边形模式在当前配置文件中被禁用。)
有人能解释一下为什么这已经被弃用了吗?为什么我必须同时传入两个面(GL_FRONT_AND_BACK)?
如果我想要"线框填充"正面,然后再"完全填充"多边形的背面怎么办?
不幸的是,这个链接(http://www.opengl.org/sdk/docs/man/xhtml/glPolygonMode.xml)没有提到任何关于这个问题的信息。至少它应该提到为什么它们被弃用了或者如何以不同的方式填充面。

一个着色器可以查看(变换后的)法向量来确定它是否渲染正面或背面。 - Ben Voigt
2
将多边形绘制两次,每次剔除不同的面。考虑到这在OpenGL 3.2核心中甚至存在,你可以算是幸运的——它已经从GLES中删除了。 - Andon M. Coleman
@AndonM.Coleman,您能否回答一下ARB为什么决定弃用这些面部选项的问题? - viktorzeid
@BenVoigt。我知道如何找到/指定多边形的边,但这不是我的问题。如果不太清楚,对不起。 - viktorzeid
@kvikram:它已经被弃用,因为着色器可以完成它,所以不需要特殊的函数。 - Ben Voigt
1个回答

6
如果你需要每个面使用不同的填充模式,你可以绘制两次多边形,每次剔除不同的面。
值得庆幸的是,OpenGL 3.2核心版本中仍然存在这个功能,因为它已经从OpenGL ES中删除。此外,在D3D中,您从未能够指定每个面的多边形填充模式。
事实上,您可以在OpenGL 3.2中使用几何着色器和片段着色器的组合来实现自己的高级填充模式(并且可以针对每个面进行操作)。由于原始装配管道现在是可编程的,因此放弃一些没有专用固定功能硬件的东西是有意义的(当然,填充模式技术上是栅格化状态)。同样,由于现在可以在片段着色器中完成,因此取消了固定功能的α测试。
至于GL_FRONT和GL_BACK的弃用讨论在哪里,您需要阅读核心规范才能找到。 OpenGL 3.2 Core Profile - E.2. Deprecated and Removed Features - pp. 332

单独的多边形绘制模式 - 多边形模式面值为GL_FRONTGL_BACK;无论哪个面被光栅化,多边形总是以相同的模式绘制。

如果您浏览3.2核心中已弃用的所有内容列表,您会注意到有很多与每侧光栅化相关的内容被删除了。幸运的是,我们仍然有双面模板缓冲区,但当然这归结于模板测试不可编程的事实。


好的,你的意思是:为两侧指定不同的填充方法更多地是管道的软件实现,由于硬件不支持这一点,因此已被删除。 - viktorzeid
1
@kvikram:嗯,不完全是这样……我的观点是,拥有每边填充模式实际上会削弱光栅化阶段(片段着色器)的可编程性。这是在光栅化期间发生的事情,超出了片段着色器的控制范围。趋势是删除管道中可以在着色器中实现的固定功能部分。 - Andon M. Coleman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接