我应该总是使用GL_CULL_FACE吗?

时间:2010-03-06 17:37:07

标签: opengl culling

渲染时我应该一直使用这种方法吗?在糟糕的gfx卡上它会减慢很多吗?

如果最终结果不会有很多淘汰面孔,那么我是否应该使用这种方法?

3 个答案:

答案 0 :(得分:21)

如果所有模型都被正确定义(凸起,顶点缠绕一致),剔除绝不会影响性能,并且几乎总能帮助提高性能。

想象一下,您正在渲染一个立方体,并禁用了剔除。立方体背面(远侧)的面朝向远离您的方向渲染,无论您选择哪种背面材质属性都应用。然后渲染立方体前面的面:由于刚刚渲染的背面是立方体的内部,它们被正面100%遮挡。

如果立方体的方向不同,可能会首先对前面进行光栅化处理,但仍会处理背面,然后z缓冲区会拒绝这些碎片。

净结果:您根据需要将2倍的片段光栅化。这对于大量多边形或复杂像素着色器来说是一个大问题。面部剔除可以让您完全避免光栅化您知道不会出现的面部。

如果你有一个包含~100,000个多边形的角色模型,则面部剔除会使像素硬件每帧都要完成的工作量减少一半。如果你有大的表面着色器,这是一个很大的节省。

如果您正在使用小型模型而不使用着色器,那么现在剔除并不重要。但无论如何都要做好准备。

答案 1 :(得分:6)

启用面部剔除(通常是背面)会对渲染性能产生重大影响。

现在要回答的问题是“为什么默认情况下没有启用剔除或为什么不总是使用?”有几个因素决定了启用剔除是否可行。一个是正​​在渲染的模型以及如何查看它。

对于模型中的每个多边形,如果只能看到前面或后面的一个面(当从所有可能的角度观察模型时),那么我们可以剔除另一面。

对于Ex:“立方体”,无论您是从内部还是外部看,旋转时,您只能看到构成立方体的每6个多边形的一侧。

另一个例子:在我的Sea-Wars(3D)游戏中的“船模型帆船”,船模型的帆是用几个扁平多边形建造的表面。当船在水中移动时,人们可以看到帆的两侧。在这种情况下,不希望剔除任何一个面。

因此,可以为场景中的所有模型启用剔除,这些模型遵循立方体语义并禁用所有其他模型。

P.S。应尽可能使用面部剔除。

答案 2 :(得分:0)

这取决于你渲染的东西。通常,剔除是理想的。我可以想象不使用它的唯一原因是渲染具有可见背面的模型。可能不需要剔除的另一种情况可能是模型较差的模型,其中顶点的定义顺序错误。