Kin*_*tos 2 transparency unity-game-engine
我有一个 Unity 材质,其反照率基于 spritesheet。精灵具有半透明性,并被格式化为 RGBA 32 位。现在,透明度在精灵中呈现,但不在材质中。如何在不使反照率的所谓不透明部分不透明的情况下做到这一点?
我尝试将渲染模式设置为透明、淡入淡出和不亮/透明。结果如下所示:
我试过不透明,但它破坏了质地。我试过剪裁,但半透明会消失或变得完全不透明。(取决于切口)
这没有代码。
我希望输出使材料的半透明部分半透明,不透明部分不透明。实际输出要么完全不透明,要么完全“半透明”,这很烦人。
所以我推迟了工作,并添加了 submesh。所以,它真的接近解决问题了。
它仍然在做那个小故障。
小智 13
好的,好消息和坏消息。好消息是,这个问题并不少见。它甚至不是 Unity 独有的。坏消息是,它对 Unity 来说并不罕见或独特的原因是因为它是一个普遍的问题,没有完美的解决方案。但是我们也许可以为您找到解决方法,所以让我们一起来解决这个问题。
3D 图形中有一个基本问题:您以什么顺序绘制事物?如果您在现实生活中绘制常规图片,那么显而易见的答案是您根据它们与观看者的距离来绘制事物。这在一段时间内可以正常工作,但是您如何处理不干净地“位于”其他事物“前面”的对象?考虑下图:
那个篮子里的水果是在碗前面还是后面?两者都不是,对吧?即使您可以将对象分成正面和背面,您如何处理相交的对象?输入 Z 缓冲区:
Z-Buffer 是一个简单的想法:在绘制对象的像素时,您还绘制了这些像素的深度。也就是说,它们离相机有多远。当您将新对象绘制到场景中时,您会检查底层像素的深度并将其与新对象的深度进行比较。如果新像素更近,则覆盖旧像素。如果旧像素更近,则您什么都不做。Z 缓冲区通常是一个永远不会直接显示的单通道(读取:灰度)图像。除了深度排序,它还可以用于各种后期处理效果,例如雾或环境遮挡。
现在,深度缓冲区的一个关键组成部分是每个像素只能存储一个值。大多数时候,这很好;毕竟,如果您只是想对一堆对象进行排序,那么您真正关心的唯一深度就是最前面一个的深度。最前面对象后面的任何东西都将不可见,这就是您需要了解或关心的全部内容。
也就是说,除非您最前面的对象是透明的。
这里的问题是渲染器不知道如何处理在透明对象后面绘制对象。为避免这种情况,智能渲染器(包括 unity)会执行以下步骤:
这样,遇到奇怪的深度排序问题的机会就最小化了。但这仍然会在几个地方分崩离析。当您使对象使用透明材料时,对象的 99% 实际上是实心的这一事实完全无关紧要。就 Unity 而言,您的整个对象是透明的,因此它是根据其相对于场景中其他透明对象的深度绘制的。如果你有大量的透明物体,你要去有问题你已经交叉网格的时刻。
那么,你是如何处理这些问题的呢?你有几个选择。
您可以做的第一件事也是最重要的事情是将透明材料限制在明确透明的区域。我相信渲染顺序首先基于材料,因此具有多个不透明材料和单个透明材料的网格可能会正常工作,不透明部分在单个透明部分之前渲染,但不要引用我那。
其次,如果您有其他选择,请使用它们。“cutout”模式似乎是二进制蒙版而不是真正的透明度的原因是因为它是。因为它不是真正透明的,所以您不会遇到任何通常会遇到的深度排序问题。这是一种权衡。
第三,尽量避免与透明材料相交的大物体。大水体因在这方面造成问题而臭名昭著。仔细考虑你必须处理什么。
最后,如果您绝对必须有多个大型交叉透明对象,请考虑将它们分成多个部分。
我很欣赏这些答案都不是真正令人满意的,但从这一切中得出的关键结论是,这与其说是错误,不如说是媒体的限制。如果你真的很热衷,你可以尝试深入研究明确解决你的问题的自定义渲染管道,但请记住,如果你这样做,你将付出额外的性能代价。
祝你好运。
| 归档时间: |
|
| 查看次数: |
8878 次 |
| 最近记录: |