OpenGL新手问题:什么是背面剔除?

时间:2010-08-29 14:18:00

标签: opengl

OpenGL的背面剔除究竟是什么?你能给出一个特定的例子吗?一个三角形?

4 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:12)

背面剔除是指远离相机/视点的三角形不考虑绘图。

Wikipedia将此定义为:

  

这是图形管道中的一个步骤,用于测试投影到屏幕上时多边形中的点是以顺时针还是逆时针顺序显示。如果用户指定前置多边形具有顺时针缠绕,如果投影在屏幕上的多边形具有逆时针缠绕,则它已被旋转以面向远离相机并且不会被绘制。

其他系统使用面法线并使用视图方向做点积。

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

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

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

答案 2 :(得分:2)

这是唯一的优化技术。

当你看一个封闭的物体,比如说一个立方体时,你只看到大约一半的脸:朝向你的脸(或者,至少,不朝向你的脸总是被另一个指向的脸遮挡对你)

如果你跳过所有这些面向后方的面孔,它将产生两个后果:   - 渲染时间将是两倍(平均)   - 最终渲染不会改变(因为另一个朝前的脸将被画在“剔除”的上面)

所以你基本上可以免费获得x2性能。

为了知道三角形是正面还是背面,你可以选择v0-v1和v0-v2,制作一个叉积。这让你脸部正常。如果此向量朝向您(点(正常,viewVector)< 0),则绘制。

答案 3 :(得分:1)

三角形的坐标按特定顺序排列,顺时针方向为IIRC。

当图形引擎从特定方向看三角形,并且坐标是逆时针时,它知道它正在通过一个物体观察三角形的背面。由于物体的正面覆盖三角形,因此无需绘制。