在顶点着色器动画的模型中渲染半透明三角形?
Rendering translucent triangles in models animated by a vertex shader?
直到现在,我一直通过将我的半透明三角形从后到前排序来处理半透明。这对四边形非常有效,但我现在想在我的模型中加入半透明。
我考虑过将半透明的三角形分开并按照与四边形相同的方式对它们进行分类。按他们的质心排序,然后将结果流式传输到 IBO 中,每帧只针对他们。但是模型中的三角形数量,以及根据 table 的骨骼、混合形状以及我的顶点着色器中的其他一些东西在 CPU 上转换它们的需要……这不在性能或理智方面似乎是一个很好的解决方案。
我的模型每个大约有 4K tris,最坏的情况下可能有 20 个,我真的很想采用一种简单可爱的风格,它依赖于半透明,不需要物理上准确,或在 4 层或更多层半透明后面绘制对象。
在 2021 年,哪种技术可能适合我的情况?我正在使用 OpenGL 3.3,但如果存在新功能,我将使用其他版本。
Afaik,没有 easy 解决你想做的事情。但是,您可以做一些事情:
- 根本不对三角形进行排序,只对单个绘制调用进行排序。这是最简单的解决方案,并且被大多数游戏使用,如果它们首先使用 translucent/transparent 对象。当然,这可能不是最好的外观(虽然它适用于凸形),但它会有很好的性能。
- 与顺序无关的透明度:有一些基于像素着色器的技术可用于渲染 transparent/translucent 对象而无需对任何内容进行排序。这些技术 通常 是近似值(也有一些非近似算法)并且往往最适合烟雾(其中小错误不那么明显)或不多 transparent/translucent 无论如何,三角形相互重叠。
- 计算着色器:您可以使用一个计算着色器根据您的动画变换您的各个顶点,然后使用另一个计算着色器对 GPU 上的三角形进行排序。这可能是您在 CPU 上所做的最直接的改进,并且有许多在 GPU 上排序内容的示例。但是,如果您以前从未使用过计算着色器,那么一开始可能很难理解它们的优点和局限性。
- 光线追踪:这可能是解决该问题的最复杂的方法,因为您需要特定的硬件、生成相应的数据结构和一些新的着色器,以及最重要的是,即使使用现代硬件,光线追踪的成本也相当高(尽管 可能 仍然比在每帧 CPU 上对三角形排序更快)。但它也不需要对三角形进行排序,即使不同的半透明对象彼此 intersecting/interleaving,它实际上也能很好地工作。
直到现在,我一直通过将我的半透明三角形从后到前排序来处理半透明。这对四边形非常有效,但我现在想在我的模型中加入半透明。
我考虑过将半透明的三角形分开并按照与四边形相同的方式对它们进行分类。按他们的质心排序,然后将结果流式传输到 IBO 中,每帧只针对他们。但是模型中的三角形数量,以及根据 table 的骨骼、混合形状以及我的顶点着色器中的其他一些东西在 CPU 上转换它们的需要……这不在性能或理智方面似乎是一个很好的解决方案。
我的模型每个大约有 4K tris,最坏的情况下可能有 20 个,我真的很想采用一种简单可爱的风格,它依赖于半透明,不需要物理上准确,或在 4 层或更多层半透明后面绘制对象。
在 2021 年,哪种技术可能适合我的情况?我正在使用 OpenGL 3.3,但如果存在新功能,我将使用其他版本。
Afaik,没有 easy 解决你想做的事情。但是,您可以做一些事情:
- 根本不对三角形进行排序,只对单个绘制调用进行排序。这是最简单的解决方案,并且被大多数游戏使用,如果它们首先使用 translucent/transparent 对象。当然,这可能不是最好的外观(虽然它适用于凸形),但它会有很好的性能。
- 与顺序无关的透明度:有一些基于像素着色器的技术可用于渲染 transparent/translucent 对象而无需对任何内容进行排序。这些技术 通常 是近似值(也有一些非近似算法)并且往往最适合烟雾(其中小错误不那么明显)或不多 transparent/translucent 无论如何,三角形相互重叠。
- 计算着色器:您可以使用一个计算着色器根据您的动画变换您的各个顶点,然后使用另一个计算着色器对 GPU 上的三角形进行排序。这可能是您在 CPU 上所做的最直接的改进,并且有许多在 GPU 上排序内容的示例。但是,如果您以前从未使用过计算着色器,那么一开始可能很难理解它们的优点和局限性。
- 光线追踪:这可能是解决该问题的最复杂的方法,因为您需要特定的硬件、生成相应的数据结构和一些新的着色器,以及最重要的是,即使使用现代硬件,光线追踪的成本也相当高(尽管 可能 仍然比在每帧 CPU 上对三角形排序更快)。但它也不需要对三角形进行排序,即使不同的半透明对象彼此 intersecting/interleaving,它实际上也能很好地工作。