关于OpenGL透明度的几个问题

关于OpenGL透明度的几个问题,opengl,geometry,distance,blending,Opengl,Geometry,Distance,Blending,关于OpenGL混合,我有两个问题 1) 我知道我必须先画不透明的对象,然后从后到前画非不透明的对象。所以我把它们放在一个列表中,取决于到中心的距离(0,0,0)。但是变换(旋转和平移)会影响我测量距离的“中心”吗 2) 第二,如果我画的是三角形,我如何测量距离?到它的中心?到它的正中心 在排序时,您当然需要考虑转换。最直接的方法是应用所有变换,然后按结果深度(z坐标)排序 实现相同目标的一种更有效的方法是对每个对象(或使用相同变换的一组对象)对视图方向应用一次逆变换,然后将每个顶点/三角形的深

关于OpenGL混合,我有两个问题

1) 我知道我必须先画不透明的对象,然后从后到前画非不透明的对象。所以我把它们放在一个列表中,取决于到中心的距离(0,0,0)。但是变换(旋转和平移)会影响我测量距离的“中心”吗


2) 第二,如果我画的是三角形,我如何测量距离?到它的中心?到它的正中心

在排序时,您当然需要考虑转换。最直接的方法是应用所有变换,然后按结果深度(z坐标)排序

实现相同目标的一种更有效的方法是对每个对象(或使用相同变换的一组对象)对视图方向应用一次逆变换,然后将每个顶点/三角形的深度计算为顶点与此逆变换视图向量的点积。这将只需要每个三角形有一个点积,而不是对它们应用完全变换。三角形的数量通常比物体的数量大几个数量级

至于使用哪一点:实际上没有一种解决方案可以适用于所有情况。三角形的中心应该和任何东西一样好。整个方法是一种近似方法,在许多情况下都能很好地工作,但在某些情况下并不完全正确

为了说明依赖顺序的透明度的基本挑战,让我们看几个例子。在下图中,视图方向是从左到右,我们看两个三角形A和B的边:

             \
              \
               B
                \
               \ \
                \ \
view ----->      \
                  A
                   \
                    \
从视觉上看,很明显B在A后面,需要先画出来。然而:

  • B的最近点比A的最近点更接近观察点
  • B的最远点比A的最远点更接近观察点
  • B的中心点比A的中心点更靠近视点
通过比较每个三角形的一个深度值,无法对这些三角形进行正确排序。要正确处理此问题,必须考虑几何图形,并使用更复杂的条件对其进行正确排序

然后出现没有有效订单的情况:

               \    /
                \  /
view ----->      \/
                 /\
                B  A
               /    \
这里,A和B没有有效的排序顺序。B的一部分在A后面,A的一部分在B后面。当你有相交的三角形时,情况就是这样。正确解决此问题的唯一方法是分割三角形

在没有有效顺序的情况下,也存在没有任何相交三角形的配置。这是一个有4个三角形的示例,这次从顶部看:

             ___________
   |\        \          |
 __|_\________\         |___
|              \        |__/
|         ______\       |
|________/       \      |
   |     \        \_____|__
   |      \_______/        |
 __|       \               |
/__|        \______________|
   |         \        \ |
   |__________\        \|

除了避免排序的开销外,这些困难也是顺序无关透明渲染方法如此吸引人的一个重要原因。

排序始终取决于视角。当然,转换确实会影响排序。最常用的排序方法是。你可能想了解深度缓冲和混合是如何工作的。非常好的答案,只有一句话:“你不能根据简单的数字比较对这些三角形进行正确排序”是正确的一半。寻找三角形之间顺序的一般方法是检查一个三角形的所有顶点是否位于另一个三角形所跨越平面的同一侧。对于不相交的三角形,情况总是如此。平面的法线(以及三角形与平面的比较边)告诉您哪个三角形位于前面。三角形的数量如何比场景中对象的数量小几个数量级?应该是另一种情况,因为对象至少由一个三角形组成。@AndonM.Coleman Argh。这是我的意思,不是我说的。。。谢谢你指出这一点。@BDL我改写了它。我的意思是,你不能只从每个三角形中取一个深度值,然后对它们进行一次比较。我认为你所描述的条件是充分的,但不是必要的。你可以有不相交的三角形,一个三角形的所有点都不在另一个三角形所跨越的平面的同一侧。再想一想,也有没有任何交点的场景,没有有效的排序。今天晚些时候,我可能会尝试添加另一个奇特的ascii图表。