为什么统一材料不能正确呈现半透明性?

时间:2019-03-30 13:07:53

标签: unity3d transparency material

我有一个Unity材料,其反照率基于Spritesheet。该子画面具有半透明性,并被格式化为RGBA 32位。 现在,透明度会在精灵中渲染,但不会在材质中渲染。 如何做到这一点而又不使反照率的不透明部分变得不透明?

我尝试将渲染模式设置为透明,淡入淡出和不亮/透明。结果看起来像这样:

Structures are assigned opaque but acts semi transparent

Structure is assigned to be opaque but acts semi transparent

我尝试过不透明,但它破坏了纹理。我尝试了抠图,但半透明效果会消失或变得完全不透明。 (取决于切口)

没有代码。

我希望输出使材料的半透明部分变为半透明,而不透明部分则变为不透明。实际输出要么是完全不透明的,要么是完全“半透明的”,这很烦人。

编辑 19/4/20 是的,我延迟了工作,但我添加了submesh。 因此,它真的很接近解决问题的方法。(thnx VPellen)看看这个

enter image description here

是的,它仍然在发生故障。 现在,我用1步输入法可以有人编辑此区域

2 个答案:

答案 0 :(得分:2)

好,好消息和坏消息。好消息是,这个问题并不罕见。它甚至不是Unity独有的。坏消息是,原因在Unity中并不罕见或独特,因为这是一个普遍的问题,没有完美的解决方案。但是我们也许可以找到您的解决方法,所以让我们一起研究一下。

3D图形中存在一个基本问题:您以什么顺序绘制事物?如果要在现实生活中绘制常规图像,那么显而易见的答案是,根据事物与观察者的距离来绘制事物。这可以工作一会儿,但是您如何处理不完全位于其他事物前面的对象?考虑下图:

A photograph of a basket containing fruit

那个篮子里的水果是在碗的前面还是后面?两者都不是吧?即使您可以将对象前后分开,也如何处理相交的对象?输入Z缓冲区:

A simple 3D scene containing several meshes above a greyscale representation of the Z-Buffer of that scene

Z缓冲区是一个简单的想法:绘制对象的像素时,您还要绘制这些像素的 depth 。也就是说,它们离相机有多远。将新对象绘制到场景中时,需要检查基础像素的深度,并将其与新对象的深度进行比较。如果新像素更近,则覆盖旧像素。如果旧像素更近,则您什么也不做。 Z缓冲区通常是一个永远不会直接显示的单通道(读取:灰度)图像。除深度排序外,它还可以用于各种后处理效果,例如雾或环境光遮挡。

现在,深度缓冲区的一个关键组成部分是每个像素只能存储一个值。在大多数情况下,这很好。毕竟,如果您只是想对一堆对象进行排序,那么您真正关心的唯一深度就是最前面一个对象的深度。最前面的对象后面的所有内容都将变为不可见,这就是您需要了解或关心的所有内容。

也就是说,除非最前面的对象是透明的。

Four images illustrating various intersecting transparent planes

这里的问题是渲染器不知道如何处理在透明对象后面绘制对象。为了避免这种情况,智能渲染器(包括unity)需要执行以下步骤:

  1. 以任何顺序绘制所有不透明的对象。
  2. 按照与相机的距离对所有透明对象进行排序。
  3. 从最远到最远绘制所有透明对象。

这样,将遇到奇怪的深度分类问题的机会降到了最低。但这仍然会在几个地方分崩离析。当您使用透明材料制作对象时,实际上99%的对象是完全无关紧要的。就Unity而言,整个对象都是透明的,因此被绘制根据其相对于场景中其他透明对象的深度。如果您有很多透明对象,那么您在网格相交的那一刻出现问题。

那么,您如何处理这些问题?您有几种选择。

您要做的第一件事也是最重要的事情是将透明材料限制在明确透明的区域。我相信渲染顺序是基于所有其他材料的,因此具有多个不透明材料和一个透明材料的网格可能会很好地工作,不透明部分先于单个透明部分进行渲染,但不要在那上面引用我。

第二,如果您有其他选择,请使用它们。之所以“剪裁”模式似乎是二进制掩码而不是真正的透明度,是因为它是因为它不是真的透明,所以您不会遇到通常会遇到的任何深度排序问题。这是一个权衡。

第三,尽量避免与透明材料形成较大的相交物体。众所周知,大面积的水会引起问题。仔细考虑您需要使用什么。

最后,如果您绝对必须有多个大的相交透明对象,请考虑将它们分解为多块。

我很欣赏这些答案中的任何一个都不是真正令人满意的,但是从这一切中得出的主要结论是,这不仅是一个漏洞,而且还只是一种媒介限制。如果您真的很热衷,可以尝试深入研究可以显式解决问题的自定义渲染管道,但是请记住,如果这样做,您将付出高昂的性能。

祝你好运。

答案 1 :(得分:0)

您说过尝试了“透明着色器”模式,但是,之后您是否尝试过更改材料颜色中的“ Alpha通道”值? 第二张图像似乎是RGBA中的Alpha为0,请尝试将其更改。