在模型中查找包含非不透明纹素的Tris

时间:2014-07-09 07:19:13

标签: c++ opengl blender

我有一个我在Blender中制作的角色模型,我用OpenGL进行渲染。模型的纹理大量使用alpha通道,我需要处理半透明特殊的三角形(在这种情况下深度排序)。

这意味着我需要发现这些将是什么。我现在这样做的方法是非常慢慢地遍历模型中的每个三角形,使用三个顶点的UV坐标,并首先检查纹理中的像素是否落在三角形中,然后检查它们中是否有任何不是不透明的。

对于2500 tris的单个型号和纹理尺寸4096x4096,此过程大约需要一分钟。我认为实时或甚至加载都太长了,因为有很多模型需要加载。

是否有更快的技术来确定透明tris的位置,足够快以便实时使用?或者只需要事先预先编译结果?

1 个答案:

答案 0 :(得分:3)

这似乎应该在运行时通过预先分解网格来避免。将包含UV坐标的所有三角形(包含半透明像素)分离到其自己的网格中。然后在运行时只对“半透明”的三角形进行深度排序。网格。在您将模型从其交换格式编译为其运行时格式时,可以完成分离过程。

你可以假设在GPU上放一个缓冲区,每个三角形都有一个bool,初始化为false。然后编写一个片段着色器,检查当前片段的alpha,如果它是< 1,将相应三角形的bool设置为true。这将需要绘制场景,从GPU读回缓冲区,对标记的三角形进行排序,然后重绘场景。这对于实时性能应该是可行的,但考虑到可以通过事先做好所有事情来避免整个过程,这看起来很浪费。