我有两个关于OpenGL混合的问题。
1)我知道我必须先绘制不透明的对象,然后再从后到前绘制不透明的对象。因此,我根据与中心的距离(0,0,0)将它们放在列表中。但是,变换(旋转和平移)会影响我测量距离的“中心”吗?
2)其次,如果我绘制的项目是三角形,如何测量距离?到其中心?到它的正中心?
当然,您需要将转换考虑在内才能进行排序。应用所有转换,然后按结果深度(z坐标)进行排序是最直接的方法。
实现同一事物的最有效的方法是对每个对象(或使用相同变换的一组对象)对视图方向应用一次逆变换,然后计算每个顶点/三角形的深度作为点积具有逆变换的视图向量的顶点的角度。每个三角形只需要一个点积,而不是对它们应用完整的变换。三角形的数量通常比对象的数量大几个数量级。
关于使用哪一点:确实没有适用于所有情况的解决方案。三角形的中心应与任何东西一样好。整个方法是一个近似值,在许多情况下都可以很好地起作用,但在某些情况下并不完全正确。
为了说明依赖于订单的透明度的基本挑战,让我们看几个示例。在下图中,视图方向是从左到右,并且我们看了两个三角形A和B的边缘:
\
\
B
\
\ \
\ \
view -----> \
A
\
\
从视觉上看,很明显B位于A后面,需要先绘制。然而:
您无法通过比较每个三角形中的一个深度值来正确地对它们进行排序。为了正确处理此问题,您必须考虑几何形状,并使用更复杂的条件对其进行正确排序。
在某些情况下,没有有效的订单:
\ /
\ /
view -----> \/
/\
B A
/ \
在这里,没有针对A和B的有效排序顺序。B的一部分在A的后面,A的一部分在B的后面。只要您有相交的三角形,情况就是如此。正确解决此问题的唯一方法是分割三角形。
在没有有效顺序的情况下,也有没有任何相交三角形的配置。这是一个有4个三角形的示例,这次是从顶部看:
___________
|\ \ |
__|_\________\ |___
| \ |__/
| ______\ |
|________/ \ |
| \ \_____|__
| \_______/ |
__| \ |
/__| \______________|
| \ \ |
|__________\ \|
这些困难是为什么与订单无关的透明度呈现方法如此吸引人的重要原因,而不仅仅是避免排序的开销。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句