OpenGL:渲染具有大量纹理透明度的模型,没有绘制顺序?

Posted

技术标签:

【中文标题】OpenGL:渲染具有大量纹理透明度的模型,没有绘制顺序?【英文标题】:OpenGL: Rendering a model with a lot of texture transparency, without draw ordering? 【发布时间】:2014-07-05 04:58:54 【问题描述】:

我有大量使用纹理来定义使用 Alpha 通道的形状的低多边形角色模型。 (例如眼镜,它只有 3 个实心大四边形,但纹理的 Alpha 通道定义了眼镜的形状)

所以有大量的透明度/半透明度正在进行,我估计每绘制一个三角形的四分之一,在需要混合的纹理中至少会有一点透明度。 大部分的透明度出现在头发中,它使几何形状非常接近并且有时会与自身相交。

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

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

【问题讨论】:

只有半透明对象才真正需要混合,而不是完全透明或完全不透明的对象。试试看,你可能只需要启用混合来渲染它,它就会完美地工作。资料来源:我已经处理过这个问题。 另外作为旁注,通常如果它们是半透明的,您可以只订购具有透明度的对象或面 @NathanWride - 它们的阴影非常柔和,因此不透明和透明之间的边缘非常模糊,但我可以尝试一下。我还在编写引擎,所以可能需要一段时间才能看到结果 在这种情况下,应该首先渲染绝对没有透明度的对象,然后再渲染透明对象。这将修复很多图形故障,之后的主要问题是排序不同的透明面,因为它们会根据您渲染的顺序混合。 我写了一个关于各种透明度渲染方法的概述来回答这个问题:***.com/questions/23280692/…。 【参考方案1】:

    您可以按与子轴的距离重新排列三轴

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

    在这上面你放上透明的tri's

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

    例如,我用实心机器在周围和内部渲染透明玻璃,如下所示:

      渲染实体部分 (CW+CCW) 渲染背面透明部分 (CCW) 渲染实体部分 (CW+CCW) 渲染正面透明部分 (CW)

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

这里OpenGL示例:

OpenGL - How to create Order Independent transparency?

【讨论】:

【参考方案2】:

在使用 alpha 之前,我发现解决此问题的一种方法是按任意顺序渲染 alpha,但只是以递归方式将它们稍微移向相机。即每个连续的三角形相对于前一个三角形被稍微平移到相机(非常轻微地使得物体看起来仍然像它们在同一个地方)。尽管根据设置这可能不足以满足您的需求,但它确实摆脱了 alpha 重叠问题,为我渲染树叶和东西,而且它不是非常耗费资源,因为您根本不需要订购任何东西。它可能不适用于您的具体情况,但值得一试,祝您好运!

【讨论】:

以上是关于OpenGL:渲染具有大量纹理透明度的模型,没有绘制顺序?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL渲染到纹理透明度问题

如何在 Xcode 中渲染具有半透明纹理的 3D 模型?

OpenGL ES 2.0 Framebuffer 渲染到纹理 iOS:没有显示

如何用OpenGL ES 2.0渲染一个透明surface

OpenGL透明纹理问题

opengl 纹理无法正确渲染