什么是背面剔除?

20

OpenGL中的背面剔除是什么?能否给我举一个三角形的具体例子?

4个回答

21

如果你仔细观察,就可以在很多视频游戏中看到这种情况。每当相机不小心穿过一个物体 - 通常是一个移动的角色 - 请注意世界会正确渲染。这是因为形成角色皮肤的三角形的背面未被渲染;它们实际上是透明的。如果不是这样,那么每当相机意外地移动到一个对象内部时,要么屏幕会变黑(因为对象的内部没有照明),要么你会得到一个奇怪的视角,看到该对象的皮肤从内部看起来是什么样子。


14

背面剔除是指不考虑朝向远离相机/视点的三角形进行绘制。

维基百科将其定义为:

这是图形管道中的一个步骤,测试多边形中的点在投影到屏幕上时是否按顺时针或逆时针顺序出现。如果用户指定正面多边形具有顺时针绕组,则在屏幕上投影的多边形具有逆时针绕组,已被旋转以面向远离相机,并且不会被绘制。

其他系统使用面法线并与视线方向进行点积运算。

这是一种相对较快的方法来决定是否绘制一个三角形。考虑一个立方体。任何时候,立方体的3个侧面都将朝向用户外部,因此不可见。即使绘制了这些面,它们也会被三个“前向”面遮挡。通过执行背面剔除,您可以将绘制的三角形数量从12减少到6(每个面2个)。

背面剔除最适用于封闭的“实体”物体,例如立方体、球体和墙壁。

有些系统没有这个功能,因为它们认为面是双面的,因此可以从任何方向看到。


我还是不理解 :) 如果我有一个红色的三角形,它应该在两种情况下都被绘制出来(顶点按顺时针或逆时针顺序)。使用面剔除,如果我从后面看它,三角形将消失。 - fhucho
@fhucho - 在这种情况下,您考虑三角形实际上是双面的,并希望关闭背面剔除。 - ChrisF
@fhucho - 没问题。您可能可以针对立方体、球体等对象进行背面消隐,并针对“开放”对象关闭它。但这将取决于您的应用程序。 - ChrisF

2

这只是一种优化技术。

当你看一个封闭的物体,比如一个立方体,你只能看到大约一半的面:朝向你的面(或者至少不朝向你的面总是被另一个朝向你的面所遮盖)

如果你跳过绘制所有这些背向面,将会有两个结果: - 渲染时间将平均提高两倍 - 最终渲染结果不会改变(因为另一个朝向面会在“剔除”的面上绘制)

所以你基本上可以免费获得2倍的性能提升。

为了知道三角形是朝前还是朝后的,你需要取v0-v1和v0-v2,进行叉积运算。这会给你面的法线。如果这个向量朝向你(点积(normal, viewVector) < 0),就进行绘制。


1

三角形的坐标以特定顺序指定,顺时针方向。

当图形引擎从特定方向查看三角形,并且坐标是逆时针的,则它知道它通过物体看向三角形的背面。由于物体的正面覆盖着三角形,因此不必绘制。


1
默认情况下实际上是相反的 - 逆时针方向的点表示正面三角形,顺时针方向的点表示背面。不过有一种方法可以改变这个设置。 - cHao
我相信Direct3D在默认情况下是正面逆时针(CCW),而OpenGL在默认情况下是正面顺时针(CW)。 - Octopus
OpenGL默认为逆时针(CCW)。可以使用 glFrontFace(GL_CW) 更改它。DirectX默认为顺时针(CW)。 - Neil Roy

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