OpenGL中的背面剔除是什么?能否给我举一个三角形的具体例子?
如果你仔细观察,就可以在很多视频游戏中看到这种情况。每当相机不小心穿过一个物体 - 通常是一个移动的角色 - 请注意世界会正确渲染。这是因为形成角色皮肤的三角形的背面未被渲染;它们实际上是透明的。如果不是这样,那么每当相机意外地移动到一个对象内部时,要么屏幕会变黑(因为对象的内部没有照明),要么你会得到一个奇怪的视角,看到该对象的皮肤从内部看起来是什么样子。
背面剔除是指不考虑朝向远离相机/视点的三角形进行绘制。
维基百科将其定义为:
这是图形管道中的一个步骤,测试多边形中的点在投影到屏幕上时是否按顺时针或逆时针顺序出现。如果用户指定正面多边形具有顺时针绕组,则在屏幕上投影的多边形具有逆时针绕组,已被旋转以面向远离相机,并且不会被绘制。
其他系统使用面法线并与视线方向进行点积运算。
这是一种相对较快的方法来决定是否绘制一个三角形。考虑一个立方体。任何时候,立方体的3个侧面都将朝向用户外部,因此不可见。即使绘制了这些面,它们也会被三个“前向”面遮挡。通过执行背面剔除,您可以将绘制的三角形数量从12减少到6(每个面2个)。
背面剔除最适用于封闭的“实体”物体,例如立方体、球体和墙壁。
有些系统没有这个功能,因为它们认为面是双面的,因此可以从任何方向看到。
这只是一种优化技术。
当你看一个封闭的物体,比如一个立方体,你只能看到大约一半的面:朝向你的面(或者至少不朝向你的面总是被另一个朝向你的面所遮盖)
如果你跳过绘制所有这些背向面,将会有两个结果: - 渲染时间将平均提高两倍 - 最终渲染结果不会改变(因为另一个朝向面会在“剔除”的面上绘制)
所以你基本上可以免费获得2倍的性能提升。
为了知道三角形是朝前还是朝后的,你需要取v0-v1和v0-v2,进行叉积运算。这会给你面的法线。如果这个向量朝向你(点积(normal, viewVector) < 0),就进行绘制。
三角形的坐标以特定顺序指定,顺时针方向。
当图形引擎从特定方向查看三角形,并且坐标是逆时针的,则它知道它通过物体看向三角形的背面。由于物体的正面覆盖着三角形,因此不必绘制。
glFrontFace(GL_CW)
更改它。DirectX默认为顺时针(CW)。 - Neil Roy