【问题标题】:OpenGL newbie question: what is back face culling?OpenGL新手问题:什么是背面剔除?
【发布时间】:2010-08-29 14:18:00
【问题描述】:

OpenGL 中的背面剔除到底是什么?你能给我一个具体的例子吗?一个三角形?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    如果您仔细观察,您会在很多电子游戏中看到这样的例子。任何时候相机不小心移动穿过一个对象——通常是一个像角色这样的移动对象——注意世界是如何继续正确渲染的。这是因为构成角色皮肤的三角形的背面没有被渲染;它们实际上是透明的。如果不是这种情况,那么每次相机意外移动到对象内部时,屏幕会变黑(因为对象内部没有亮起),或者您会对对象皮肤的外观产生奇怪的看法从里面。

    【讨论】:

      【解决方案2】:

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

      Wikipedia 将其定义为:

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

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

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

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

      有些系统没有此功能,因为它们认为面是双面的,因此从任一方向都可见。

      【讨论】:

      • 我还是不明白 :) 如果我有一个红色三角形,它应该在两种情况下都绘制(顶点是 cw 或 ccw 顺序)。使用面部剔除,如果我从后面看,三角形会消失。
      • @fhucho - 在这种情况下,您正在考虑三角形实际上是双面的,并且想要将背面剔除“关闭”。
      • @fhucho - 没问题。您可能可以对每个对象进行背面剔除,您可以在其中为立方体、球体等打开它,为“开放”对象关闭它。但这取决于您的应用程序。
      【解决方案3】:

      它只是和优化技术。

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

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

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

      为了知道三角形是正面还是背面,你把v0-v1和v0-v2做一个叉积。这让你的脸正常。如果这个向量朝向你(dot(normal, viewVector)

      【讨论】:

        【解决方案4】:

        三角形的坐标按特定顺序指定,顺时针 IIRC。

        当图形引擎从一个特定的方向看一个三角形,并且坐标是逆时针的,它就知道它是通过一个对象看三角形的背面。由于对象的正面覆盖了三角形,因此不必绘制。

        【讨论】:

        • 默认情况下实际上是相反的——CCW点表示朝前的三角形,CW点表示朝后的三角形。不过,有一种方法可以改变这一点。
        • 我相信Direct3D默认是CCW的前端,而OpenGL默认是CW的前端
        • OpenGL 默认为 CCW。可以使用glFrontFace(GL_CW) 进行更改。 DirectX 默认为 CW。
        猜你喜欢
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 2014-07-18
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多