具有透明度的模型

Posted

技术标签:

【中文标题】具有透明度的模型【英文标题】:Model with transparency 【发布时间】:2013-09-09 20:55:24 【问题描述】:

我有一个带有透明四边形胡须的模型。我不知道哪些三角形属于胡须,因为它们的颜色来自传递给片段着色器的纹理。我试图在模型导出过程中将三角形重新排序到前面,但这无济于事。所以我实现了 MSAA 和 Alpha to Coverage,但这也没有帮助。我的最后一次尝试是绘制模型,关闭深度蒙版并跳过任何透明数据,因此颜色缓冲区将具有不清晰的颜色值来混合。然后我会再次绘制模型,并进行深度测试并绘制 alpha 片段。

到目前为止,我尝试过的任何方法都没有奏效。我可以尝试哪些其他技术来让模型的胡须正确绘制?我正在寻找一种不使用一堆扩展来处理这个问题的方法。我更喜欢可以用普通的旧 OpenGL 4 处理的技术。

这是我正在处理的图像。

这是我应用所选答案后得到的。

【问题讨论】:

头发通常与主模型分开渲染。您首先绘制模型的不透明部分,然后是头发。您是否为整个模型使用单个蒙皮纹理?如果不是,那么确定模型的哪些部分是半透明的,哪些不是半透明的并在不同的时间绘制它们应该是微不足道的。作为最后的手段(这完全是一种技巧,但易于实现),您可以在片段着色器中测试 alpha 值并丢弃小于 0.5 的任何值;那么你画面部毛发的顺序就没有那么重要了。 是的,我使用的是单一蒙皮纹理。我曾尝试用我选择的 alpha 丢弃碎片,但这会使他的胡须看起来很脏。我将查看搅拌器文件,看看我是否可以弄清楚如何将胡须作为一个单独的对象,它仍然与动作捕捉骨架一起移动。 是的,我也是这么想的。如今,这几乎不是一个可接受的解决方案:) 如果您能以某种方式在模型中以不同方式识别您的面部毛发,另一种解决方案就是在您的绘图调用中索引它们的顶点last。例如,如果您使用骨骼动画,可能会在加载或导出模型时为头发分配最高骨骼 ID,并按骨骼 ID 对三角形顺序进行排序。这将确保首先考虑所有不透明的几何体,并且唯一的透明度问题将与多层头发有关,这通常是可以接受的。 【参考方案1】:

您正在尝试做的还有一个很大程度上尚未解决的问题:订单独立透明度。 MSAA 和 alpha 覆盖率完全不同。

到目前为止,最好的解决方案是将模型分成不透明和毛茸茸的部分。首先绘制场景的不透明部分,然后绘制所有(半)半透明的,在第二遍中从远到近排序。

您的图像看起来像是胡须被渲染为第一个的东西,这与您真正想要的完全相反。

【讨论】:

这是我选择的方法。它实施起来很快,并且不会占用太多额外的时间。将透明部分绘制为单独的模型后,我什至可以将它们放入透明队列中,以便在处理渲染命令时像处理其他所有内容一样处理它们。【参考方案2】:

简单的方法:

    启用深度写入(深度蒙版),禁用 alpha 混合,绘制没有胡须的模型。 禁用深度写入,启用 alpha 混合,绘制胡须。确保启用面部剔除。

困难重重:

因为使用 z-buffer 的渲染器中与顺序无关的透明度是一个未解决的问题(正如 datenwolf 所说),您可以尝试depth-peeling。我相信这篇论文在 OpenGL SDK 中可用。很可能它会比“简单方式”慢,并且最大重叠透明多边形的数量会有限制。另请查看order-independent transparency 上的***文章。

【讨论】:

以上是关于具有透明度的模型的主要内容,如果未能解决你的问题,请参考以下文章

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

场景查看器:是不是支持透明度?

WinForms 中具有 Alpha 通道透明度/不透明度的启动画面

具有不透明度的 div 内的 div 没有不透明度

threejs控制3d模型透明度

渲染具有透明度的纹理时 OpenGL 不需要的像素