OpenGL中的背面剔除到底是什么?你能给予我一个具体的例子吗?比如一个三角形。
f0ofjuux1#
如果你仔细观察,你可以在很多电子游戏中看到这样的例子。任何时候,当摄像机意外地移动通过一个物体时a-通常是像角色这样的移动物体--注意世界是如何继续正确渲染的。这是因为形成角色皮肤的三角形的背面没有被渲染;如果不是这样的话,那么每次相机不小心移动到物体内部时,屏幕要么会变黑(因为物体内部没有照明),要么你会得到一个奇怪的视角,从内部看物体的皮肤是什么样子。
avwztpqn2#
背面剔除是指不考虑绘制指向远离摄影机/视点的三角形。Wikipedia将其定义为:这是图形管道中的一个步骤,用于测试投影到屏幕上时多边形中的点是以顺时针还是逆时针顺序显示。如果用户指定正面多边形具有顺时针缠绕,则如果投影到屏幕上的多边形具有逆时针缠绕,则该多边形已旋转为背向摄像机,并且不会绘制。其他系统使用面法线并与观察方向进行点积。这是决定是否绘制三角形的一种相对快速的方法。考虑一个立方体。在任何时候,立方体的三个边都将背对用户,因此不可见。即使绘制了这些边,它们也会被三个“向前”的边遮挡。通过执行背面剔除,您可以将绘制的三角形数量从12个减少到6个(每边2个)。背面剔除最适用于闭合的“实体”对象,如立方体、球体、墙。有些系统没有这个功能,因为它们认为面是双面的,因此从任何方向都是可见的。
eoxn13cs3#
这是唯一的优化技术.当你观察一个封闭的物体时,比如立方体,你只能看到大约一半的面:朝向您的面(或者,至少,不朝向您的面始终被另一个指向您的面遮挡)如果跳过绘制所有这些向后的面,将产生两个后果:- 渲染时间将缩短两倍(平均)-最终渲染不会更改(因为另一个正面将绘制在“剔除”的面之上)所以你基本上可以免费得到x2 perf。为了知道三角形是正面还是背面,你取v0-v1和v0-v2,做叉积,得到面法线,如果这个矢量朝向你(dot(normal,viewVector)〈0),画出。
yquaqz184#
三角形的坐标以特定的顺序指定,顺时针IIRC。当图形引擎从一个特定的方向观察一个三角形,并且坐标是逆时针方向时,它知道它是通过一个对象观察三角形的背面。由于对象的正面覆盖了三角形,所以不必绘制它。
4条答案
按热度按时间f0ofjuux1#
如果你仔细观察,你可以在很多电子游戏中看到这样的例子。任何时候,当摄像机意外地移动通过一个物体时a-通常是像角色这样的移动物体--注意世界是如何继续正确渲染的。这是因为形成角色皮肤的三角形的背面没有被渲染;如果不是这样的话,那么每次相机不小心移动到物体内部时,屏幕要么会变黑(因为物体内部没有照明),要么你会得到一个奇怪的视角,从内部看物体的皮肤是什么样子。
avwztpqn2#
背面剔除是指不考虑绘制指向远离摄影机/视点的三角形。
Wikipedia将其定义为:
这是图形管道中的一个步骤,用于测试投影到屏幕上时多边形中的点是以顺时针还是逆时针顺序显示。如果用户指定正面多边形具有顺时针缠绕,则如果投影到屏幕上的多边形具有逆时针缠绕,则该多边形已旋转为背向摄像机,并且不会绘制。
其他系统使用面法线并与观察方向进行点积。
这是决定是否绘制三角形的一种相对快速的方法。考虑一个立方体。在任何时候,立方体的三个边都将背对用户,因此不可见。即使绘制了这些边,它们也会被三个“向前”的边遮挡。通过执行背面剔除,您可以将绘制的三角形数量从12个减少到6个(每边2个)。
背面剔除最适用于闭合的“实体”对象,如立方体、球体、墙。
有些系统没有这个功能,因为它们认为面是双面的,因此从任何方向都是可见的。
eoxn13cs3#
这是唯一的优化技术.
当你观察一个封闭的物体时,比如立方体,你只能看到大约一半的面:朝向您的面(或者,至少,不朝向您的面始终被另一个指向您的面遮挡)
如果跳过绘制所有这些向后的面,将产生两个后果:- 渲染时间将缩短两倍(平均)-最终渲染不会更改(因为另一个正面将绘制在“剔除”的面之上)
所以你基本上可以免费得到x2 perf。
为了知道三角形是正面还是背面,你取v0-v1和v0-v2,做叉积,得到面法线,如果这个矢量朝向你(dot(normal,viewVector)〈0),画出。
yquaqz184#
三角形的坐标以特定的顺序指定,顺时针IIRC。
当图形引擎从一个特定的方向观察一个三角形,并且坐标是逆时针方向时,它知道它是通过一个对象观察三角形的背面。由于对象的正面覆盖了三角形,所以不必绘制它。