2014-11-08 57 views
2

我有两个关于OpenGL混合的问题。有关OpenGL透明度的一些问题

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

2)第二,如果我画的项目是三角形,我该如何测量距离?为了它的香味?到它的正中心?

+0

排序总是取决于观点。当然,转换确实会影响你的排序。最常见的分类方法是[BSP-Trees](http://computer-graphics.se/TSBK07-files/pdf/PDF09/6b.pdf)。 – BDL 2014-11-08 15:19:30

+0

您可能想了解深度缓冲区和混合是如何工作的。 – 2014-11-08 16:01:17

回答

6

您当然需要考虑转换以进行排序。应用所有转换,然后按照生成的深度(z坐标)进行排序是最直接的方法。

实现同样目标的更有效的方法是对每个对象(或使用相同变换的对象集合)应用逆向变换到您的视图方向一次,然后计算每个顶点/三角形的深度作为顶点与这个逆变换的视图矢量的点积。这需要每个三角形只有一个点积,而不是对它们进行全面转换。而且三角形的数量往往比物体的数量大得多。

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

为了说明顺序相关透明度的基本挑战,我们来看几个例子。在下图中,视图方向是从左至右,我们期待在两个三角形A和B的边缘上:

   \ 
       \ 
       B 
       \ 
       \ \ 
       \ \ 
view ----->  \ 
        A 
        \ 
        \ 

从外观上看,很显然,B是A的背后,需要先绘制。然而:

  • B的最接近的点比A的最近点更靠近视点
  • B的最远点比A的最远点更靠近视点
  • B的中心点比A的中心点更接近视点。

通过比较每个三角形的一个深度值,您无法正确排序这些三角形。为了正确处理这个问题,你必须考虑几何结构,并使用更复杂的标准来正确地排列它们。

然后存在这样的情况不存在有效的顺序:

   \ /
       \/
view ----->  \/ 
       /\ 
       B A 
      / \ 

在这里,有A和B没有排序顺序,将是有效的。 B的部分位于A的后面,A的部分位于B的后面。只要有三角形相交,就是这种情况。正确解决这个问题的唯一方法是分割三角形。

还有没有任何相交三角形没有有效顺序的配置。这是4个三角形的例子,从上面这段时间寻找:

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

这些困难是为什么顺序无关的透明度渲染方法是如此吸引人,不仅仅是避免排序的开销的一个重要原因。

+0

非常好的答案,只有一句话:“你不能根据简单的数字比较正确排序这些三角形”只是一半的真实。找到三角形之间的排序的一般方法是检查一个三角形的所有顶点是否位于另一个三角形所跨平面的同一侧。对于不相交的三角形,情况总是如此。平面的法线(以及三角形相对于平面的一侧)告诉你哪个三角形在前面。 – BDL 2014-11-08 17:22:02

+0

三角形的数量级数如何比场景中的物体数量少?它应该是相反的,因为一个物体至少由一个三角形组成。 – 2014-11-08 18:19:05

+0

@ AndonM.Coleman Argh。这是我的意思,不是我说的......谢谢你指出。 – 2014-11-08 18:27:37