我有低多边形角色模型,这些模型大量使用纹理来使用 alpha channel 定义形状。 (一个例子是眼镜,它只有 3 个实心大四边形,但纹理的 alpha channel 定义了眼镜的形状)
所以有大量的透明度/半透明度,我估计每绘制一个三角形的四分之一,在需要混合的纹理中至少会有一点透明度。
大部分透明度出现在头发中,头发将几何体分层非常紧密,有时会自相交。
我的问题,有没有什么方法可以获得合理的 alpha 混合行为,而无需根据深度对绘制的 tris 进行排序?我读过的大多数(旧的)opengl 文档都说需要排序才能混合任何类型的透明度,但我觉得在这种情况下,每帧都对每三个元素进行排序,成本太高。 (或者至少,超出了我不花数周时间编写代码的能力)
如果重要的话,没有光照或顶点着色。结果不必准确,但如果可能的话,我希望它们在视觉上令人愉悦且一致。
最佳答案
您可以根据与子轴的距离对 tri 重新排序
所以最靠近轴的渲染层最先渲染,最外层最后渲染。
在此之上放置透明三元组
除非你的整个部分都是透明的,否则应该没问题。顺序问题会导致故障,例如有时您无法正确地(从某些角度)看到透明对象后面的透明对象,这也可以通过多 channel 渲染和适当的
CULL_FACE
前端切换来纠正。请注意,这不会解决 100% 的伪影……形状越复杂,故障就越多。例如,我像这样在周围和内部渲染带有实体机器的透明玻璃:
- 渲染实体部分(
CW+CCW
) - 渲染背面透明部分(
CCW
) - 渲染实体部分(
CW+CCW
) - 渲染前端透明部分(
CW
)
- 渲染实体部分(
(我的模型是用 CW
缠绕规则定义的)
这里是OpenGL例子:
关于c++ - OpenGL:在没有绘制顺序的情况下渲染具有大量纹理透明度的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24583133/