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