【问题标题】:Rendering translucent triangles in models animated by a vertex shader?在由顶点着色器动画的模型中渲染半透明三角形?
【发布时间】:2021-07-14 14:58:27
【问题描述】:

到目前为止,我一直在通过将半透明三角形从前到后排序来处理半透明。这对四边形非常有效,但我现在想在我的模型中加入半透明。

我曾想过将半透明的 tris 分离出来,并以与我的四边形相同的方式对它们进行排序。按他们的质心排序,然后将结果流式传输到每个帧的 IBO 中。但是模型中三角形的数量,以及需要根据骨骼表在 CPU 上转换它们,混合形状,以及我的顶点着色器中的其他一些东西......这似乎不是一个好的解决方案表现或理智。

我的模型每个大约 4K tris,一个场景中最多可能有 20 个,我真的很想倾向于一种简单可爱的风格,它依赖于半透明,它不必在物理上准确或绘图4 层或更多半透明层后面的对象。

在 2021 年,哪种技术可能适合我的情况?我正在使用 OpenGL 3.3,但如果有新功能,我将使用另一个版本。

【问题讨论】:

    标签: c++ opengl 3d transparency translucency


    【解决方案1】:

    Afaik,没有简单解决您想做的事情的方法。但是,您可以做一些事情:

    • 根本不对三角形进行排序,只对单个绘图调用进行排序。这是最简单的解决方案,并且被大多数游戏使用,如果他们首先使用半透明/透明对象的话。当然,这可能不是最好的外观(尽管它适用于凸形),但它会具有非常好的性能。
    • 与顺序无关的透明度:有一些基于像素着色器的技术可以渲染透明/半透明对象,而无需对任何内容进行排序。这些技术通常是近似值(也有一些非近似算法),并且往往最适用于烟雾(小错误不那么明显)或透明/半透明三角形不多的情况反正互相重叠。
    • 计算着色器:您可以使用计算着色器根据您的动画转换您的各个顶点,然后使用另一个计算着色器在 GPU 上对三角形进行排序。这可能是您在 CPU 上所做的最直接的改进,并且有许多在 GPU 上排序内容的示例。但是,如果您以前从未使用过计算着色器,那么一开始可能有点难以理解它们的优势和局限性。
    • 光线追踪:这可能是解决该问题最复杂的方法,因为您需要特定的硬件、生成相应的数据结构和一些新的着色器,除此之外,即使使用现代在硬件方面,光线追踪的成本相当高(尽管可能仍然比在 CPU 上每帧对三角形进行排序要快)。但它也不需要对你的三角形进行排序,即使不同的半透明对象相互交叉/交错,它实际上也能很好地工作。

    【讨论】:

    • 深度剥离不是近似的 OIT,但需要您多次渲染同一个对象!我似乎还记得一种基于在像素着色器中生成链表并运行后处理过程以对它们进行排序和合并的技术。
    • @user253751 是的,还有一些非近似的 OIT 方法,这就是我使用 通常这个词的原因。我不想列出每一个 OIT 算法,因为有很多而且我肯定会迷惑一些。我将编辑答案以更清楚地说明这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多