您当然需要将转换考虑在内进行排序.应用所有变换,然后按结果深度(z坐标)排序,是最直接的方法.
实现相同目标的一种更有效的方法是对每个对象(或使用相同变换的对象集)应用逆变换到视图方向一次,然后计算每个顶点/三角形的深度作为点积具有该逆变换视图矢量的顶点的.这将只需要每个三角形一个点积,而不是对它们应用完整的变换.并且三角形的数量通常比对象的数量大.
至于使用哪个点:确实没有适用于所有情况的解决方案.三角形的中心应该和任何东西一样好.整个方法是一种近似,在许多情况下可以很好地工作,但在某些情况下不完全正确.
为了说明依赖于顺序的透明度的基本挑战,让我们看一些例子.在下图中,视图方向是从左到右,我们查看两个三角形A和B边缘:
\
\
B
\
\ \
\ \
view -----> \
A
\
\
Run Code Online (Sandbox Code Playgroud)
在视觉上,很明显B在A后面,需要先绘制.然而:
您无法通过比较每个三角形的单个深度值来对这些三角形进行正确排序.要正确处理此问题,您必须考虑几何图形,并使用更复杂的条件来正确排序它们.
然后有些情况下没有有效的订单:
\ /
\ /
view -----> \/
/\
B A
/ \
Run Code Online (Sandbox Code Playgroud)
这里,A和B没有有效的排序顺序.B的部分位于A的后面,A的部分位于B的后面.只要有相交的三角形,就会出现这种情况.正确解决此问题的唯一方法是拆分三角形.
还有没有任何交叉三角形的配置,其中没有有效的订单.这是一个带有4个三角形的示例,这次从顶部看:
___________
|\ \ |
__|_\________\ |___
| \ |__/
| ______\ |
|________/ \ |
| \ \_____|__
| \_______/ |
__| \ |
/__| \______________|
| \ \ |
|__________\ \|
Run Code Online (Sandbox Code Playgroud)
这些困难是订单独立透明度渲染方法如此具有吸引力的重要原因,而不仅仅是避免排序的开销.