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

问题描述 投票:1回答:2

我有一个Unity材料,其反照率基于spritesheet。精灵具有半透明性,格式为RGBA 32bit。现在,透明度在精灵中呈现,但不在材质中呈现。如何在不使反照率的不透明部分变得不透明的情况下如何做到这一点?

我尝试将渲染模式设置为透明,淡入淡出和不亮/透明。结果如下:

Structures are assigned opaque but acts semi transparent

Structure is assigned to be opaque but acts semi transparent

我尝试了不透明,但它破坏了纹理。我尝试过剪裁,但是半透明度会变得完全不透明。 (取决于剪影)

这没有代码。

我希望输出使材料的半透明部分半透明,不透明部分不透明。实际输出要么完全不透明要么完全“半透明”,这非常烦人。

编辑4/20/19所以是的,我推迟了工作但是我添加了submesh。所以,它真的很接近解决问题..(thnx VPellen)看看这个

enter image description here

是的它还在做那个小故障。现在我用1个手机打字可以有人编辑这个区域

unity3d transparency material
2个回答
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-Buffer是一个简单的想法:在绘制对象的像素时,您还可以绘制这些像素的深度。也就是说,他们离相机有多远。在场景中绘制新对象时,可以检查基础像素的深度,并将其与新对象的深度进行比较。如果新像素更近,则覆盖旧像素。如果旧像素更近,则不做任何事情。 Z缓冲区通常是单个通道(读取:灰度)图像,永远不会直接显示。除了深度排序,它还可以用于各种后处理效果,例如雾或环境遮挡。

现在,深度缓冲区的一个关键组件是它每个像素只能存储一个值。大多数时候,这很好;毕竟,如果你只是想对一堆物体进行分类,那么你真正关心的唯一深度就是最前面的深度。最前面的物体背后的任何东西都将变得不可见,这就是你需要知道或关心的全部内容。

也就是说,除非你最前面的物体是透明的。

Four images illustrating various intersecting transparent planes

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

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

这样,最小化了进入奇怪的深度排序问题的机会。但这仍然会在几个地方崩溃。当您使用透明材质时,99%的对象实际上是实心的这一事实完全无关紧要。就Unity而言,整个对象都是透明的,因此根据其相对于场景中其他透明对象的深度进行绘制。如果你有很多透明物体,那么在你有相交网格的那一刻就会遇到问题。

那么,你如何处理这些问题呢?你有几个选择。

您可以做的第一件也是最重要的事情是将透明材料限制在明确透明的区域。我相信渲染顺序基于最重要的材料,因此使用具有多个不透明材质和单个透明材质的网格可能工作正常,不透明部分在单个透明部分之前渲染,但不引用我那。

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

第三,尽量避免使用透明材料的大型交叉物体。大型水体在这方面造成问题是臭名昭着的。仔细考虑您必须使用的内容。

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

我很欣赏这些答案都不是真正令人满意的,但是从这一切中得到的关键是,这不是一个错误,而是对媒介的限制。如果你真的很热衷,你可以尝试深入研究可以明确解决问题的自定义渲染管道,但请记住,如果你这样做,你将会付出高昂的性能。

祝好运。


0
投票

您说您尝试过透明着色器模式,但是,您之后是否尝试更改材质颜色中的Alpha通道值?第二个图像看起来像RGBA中的Alpha是0,尝试更改它。

© www.soinside.com 2019 - 2024. All rights reserved.