c++ - OpenGL:在没有绘制顺序的情况下渲染具有大量纹理透明度的模型?

标签 c++ opengl graphics

我有低多边形角色模型,这些模型大量使用纹理来使用 alpha channel 定义形状。 (一个例子是眼镜,它只有 3 个实心大四边形,但纹理的 alpha channel 定义了眼镜的形状)

所以有大量的透明度/半透明度,我估计每绘制一个三角形的四分之一,在需要混合的纹理中至少会有一点透明度。
大部分透明度出现在头发中,头发将几何体分层非常紧密,有时会自相交。

我的问题,有没有什么方法可以获得合理的 alpha 混合行为,而无需根据深度对绘制的 tris 进行排序?我读过的大多数(旧的)opengl 文档都说需要排序才能混合任何类型的透明度,但我觉得在这种情况下,每帧都对每三个元素进行排序,成本太高。 (或者至少,超出了我不花数周时间编写代码的能力)

如果重要的话,没有光照或顶点着色。结果不必准确,但如果可能的话,我希望它们在视觉上令人愉悦且一致。

最佳答案

  1. 您可以根据与子轴的距离对 tri 重新排序

    axises

    所以最靠近轴的渲染层最先渲染,最外层最后渲染。

  2. 在此之上放置透明三元组

    除非你的整个部分都是透明的,否则应该没问题。顺序问题会导致故障,例如有时您无法正确地(从某些角度)看到透明对象后面的透明对象,这也可以通过多 channel 渲染和适当的 CULL_FACE 前端切换来纠正。请注意,这不会解决 100% 的伪影……形状越复杂,故障就越多。

    例如,我像这样在周围和内部渲染带有实体机器的透明玻璃:

    1. 渲染实体部分(CW+CCW)
    2. 渲染背面透明部分(CCW)
    3. 渲染实体部分(CW+CCW)
    4. 渲染前端透明部分(CW)

(我的模型是用 CW 缠绕规则定义的)

这里是OpenGL例子:

关于c++ - OpenGL:在没有绘制顺序的情况下渲染具有大量纹理透明度的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24583133/

相关文章:

c++ - 带有 NameFullyQualifiedDN 的 GetUserNameEx 在 3-4 秒内没有返回,为什么?

objective-c - 返回 C 结构数组

windows - 使用多个显卡在 Windows XP 中进行 OpenGL 渲染

r - R的pscl包

c++ - 将 Opencv 矩阵旋转 90、180、270 度

c++ - 为什么你不能从一个元组中分配一个对,但元组可以从一个对中分配?

c++ - 如何简化这个 switch 语句?

c++ - std::vector<MyClass*> 的 VBO 和正确的步幅

math - 为什么通过添加坐标来添加两个点是错误的?

computer-vision - 合并照片纹理 -(来自校准的相机) - 投影到几何体上