为什么 unity material 不能正确渲染半透明?
Why does unity material not render semi-transparency properly?
我有一个 Unity material,它的反照率基于 spritesheet。精灵具有半透明性,格式为 RGBA 32 位。
现在,透明度呈现在 sprite 中,而不是 material。
我如何做到这一点,同时又不使反照率的不透明部分变得不透明?
我试过将渲染模式设置为透明、淡入淡出和 unlit/transparent。结果如下所示:
我试过不透明的,但它破坏了纹理。我试过镂空,但半透明会消失或变得完全不透明。 (取决于切口)
没有代码。
我希望输出使 material 的半透明部分半透明,不透明部分不透明。实际输出要么完全不透明要么完全"semi-transparent",这非常烦人。
编辑
所以我耽误了工作,我添加了submesh。所以,离解决问题真的很近了。
它还在做那个故障。
您说您尝试过透明着色器模式,但是,您是否尝试过更改 material 颜色中的 Alpha 通道值?
第二张图好像RGBA中的Alpha为0,试试改一下
好的,好消息和坏消息。好消息是,这个问题并不少见。它甚至不是 Unity 独有的。坏消息是,原因它对 Unity 来说并不少见或独特,因为它是一个没有完美解决方案的普遍问题。但我们或许可以为您找到解决方法,所以让我们一起解决这个问题。
3D 图形中有一个基本问题:您按什么顺序绘制东西?如果你在现实生活中画一幅普通的图画,显而易见的答案是你根据它们离观察者的距离来画这些东西。这暂时可以正常工作,但是您如何处理与其他事物不完全 "in front" 的对象?考虑下图:
篮子里的水果是在碗的前面还是后面?两者都不是,对吧?即使你可以将对象分成前后,你如何处理相交的对象?输入 Z 缓冲区:
Z 缓冲区是一个简单的想法:绘制对象的像素时,您还绘制了这些像素的 深度。也就是说,他们离相机有多远。当您将新对象绘制到场景中时,您会检查底层像素的深度并将其与新对象的深度进行比较。如果新像素更近,则覆盖旧像素。如果旧像素更近,则您什么都不做。 Z 缓冲区通常是从不直接显示的单通道(读取:灰度)图像。除了深度排序,它还可以用于各种 post 处理效果,例如雾或环境遮挡。
现在,深度缓冲区的一个关键组成部分是每个像素只能存储一个值。大多数时候,这很好;毕竟,如果您只是想对一堆对象进行排序,那么您真正关心的唯一深度就是最前面那个对象的深度。最前面的对象后面的任何内容都将变得不可见,这就是您需要了解或关心的全部内容。
也就是说,除非您最前面的对象是透明的。
这里的问题是渲染器不知道如何处理在透明对象后面绘制对象。为避免这种情况,智能渲染器(包括 unity)会执行以下步骤:
- 以任意顺序绘制所有不透明对象。
- 按距相机的距离对所有透明物体进行排序。
- 绘制所有透明对象,从最远到最近。
这样,运行陷入奇怪的深度排序问题的可能性就会降到最低。但这仍然会在几个地方分崩离析。当你让你的对象使用透明 material 时,99% 的对象实际上是实心的 是完全无关紧要的。 就 Unity 而言,你的整个对象是透明,因此根据它相对于场景中其他透明对象的深度来绘制它。如果您有很多透明对象,那么当您拥有相交网格时,您将遇到问题。
那么,您是如何处理这些问题的呢?您有几个选择。
您可以做的第一件也是最重要的事情是将透明 material 限制为 明确 透明的区域。我相信 渲染顺序是基于 materials 最重要的,所以有一个包含几个不透明 materials 和一个透明的网格可能会很好,不透明部分在单个透明部分之前呈现,但不要引用我的话。
其次,如果你有替代品,就使用它们。 "cutout" 模式似乎是二进制掩码而不是真正透明的原因是因为 它是。 因为它不是真正透明的,所以你不会 运行 进入任何您通常会遇到的深度排序问题。这是一个权衡。
第三,尽量避免透明的大交叉物体material。大水体因在这方面造成问题而臭名昭著。仔细考虑你必须使用什么。
最后,如果您绝对必须有多个大型交叉透明对象,请考虑将它们分成多个部分。
我很欣赏 none 这些答案确实令人满意,但从所有这些中得出的关键结论是,与其说这是一个错误,不如说是媒体的限制。如果您真的很热衷,可以尝试深入研究可以明确解决您的问题的自定义渲染管道,但请记住,如果这样做,您将付出额外的性能代价。
祝你好运。
我有一个 Unity material,它的反照率基于 spritesheet。精灵具有半透明性,格式为 RGBA 32 位。 现在,透明度呈现在 sprite 中,而不是 material。 我如何做到这一点,同时又不使反照率的不透明部分变得不透明?
我试过将渲染模式设置为透明、淡入淡出和 unlit/transparent。结果如下所示:
我试过不透明的,但它破坏了纹理。我试过镂空,但半透明会消失或变得完全不透明。 (取决于切口)
没有代码。
我希望输出使 material 的半透明部分半透明,不透明部分不透明。实际输出要么完全不透明要么完全"semi-transparent",这非常烦人。
编辑
所以我耽误了工作,我添加了submesh。所以,离解决问题真的很近了。
它还在做那个故障。
您说您尝试过透明着色器模式,但是,您是否尝试过更改 material 颜色中的 Alpha 通道值? 第二张图好像RGBA中的Alpha为0,试试改一下
好的,好消息和坏消息。好消息是,这个问题并不少见。它甚至不是 Unity 独有的。坏消息是,原因它对 Unity 来说并不少见或独特,因为它是一个没有完美解决方案的普遍问题。但我们或许可以为您找到解决方法,所以让我们一起解决这个问题。
3D 图形中有一个基本问题:您按什么顺序绘制东西?如果你在现实生活中画一幅普通的图画,显而易见的答案是你根据它们离观察者的距离来画这些东西。这暂时可以正常工作,但是您如何处理与其他事物不完全 "in front" 的对象?考虑下图:
篮子里的水果是在碗的前面还是后面?两者都不是,对吧?即使你可以将对象分成前后,你如何处理相交的对象?输入 Z 缓冲区:
Z 缓冲区是一个简单的想法:绘制对象的像素时,您还绘制了这些像素的 深度。也就是说,他们离相机有多远。当您将新对象绘制到场景中时,您会检查底层像素的深度并将其与新对象的深度进行比较。如果新像素更近,则覆盖旧像素。如果旧像素更近,则您什么都不做。 Z 缓冲区通常是从不直接显示的单通道(读取:灰度)图像。除了深度排序,它还可以用于各种 post 处理效果,例如雾或环境遮挡。
现在,深度缓冲区的一个关键组成部分是每个像素只能存储一个值。大多数时候,这很好;毕竟,如果您只是想对一堆对象进行排序,那么您真正关心的唯一深度就是最前面那个对象的深度。最前面的对象后面的任何内容都将变得不可见,这就是您需要了解或关心的全部内容。
也就是说,除非您最前面的对象是透明的。
这里的问题是渲染器不知道如何处理在透明对象后面绘制对象。为避免这种情况,智能渲染器(包括 unity)会执行以下步骤:
- 以任意顺序绘制所有不透明对象。
- 按距相机的距离对所有透明物体进行排序。
- 绘制所有透明对象,从最远到最近。
这样,运行陷入奇怪的深度排序问题的可能性就会降到最低。但这仍然会在几个地方分崩离析。当你让你的对象使用透明 material 时,99% 的对象实际上是实心的 是完全无关紧要的。 就 Unity 而言,你的整个对象是透明,因此根据它相对于场景中其他透明对象的深度来绘制它。如果您有很多透明对象,那么当您拥有相交网格时,您将遇到问题。
那么,您是如何处理这些问题的呢?您有几个选择。
您可以做的第一件也是最重要的事情是将透明 material 限制为 明确 透明的区域。我相信 渲染顺序是基于 materials 最重要的,所以有一个包含几个不透明 materials 和一个透明的网格可能会很好,不透明部分在单个透明部分之前呈现,但不要引用我的话。
其次,如果你有替代品,就使用它们。 "cutout" 模式似乎是二进制掩码而不是真正透明的原因是因为 它是。 因为它不是真正透明的,所以你不会 运行 进入任何您通常会遇到的深度排序问题。这是一个权衡。
第三,尽量避免透明的大交叉物体material。大水体因在这方面造成问题而臭名昭著。仔细考虑你必须使用什么。
最后,如果您绝对必须有多个大型交叉透明对象,请考虑将它们分成多个部分。
我很欣赏 none 这些答案确实令人满意,但从所有这些中得出的关键结论是,与其说这是一个错误,不如说是媒体的限制。如果您真的很热衷,可以尝试深入研究可以明确解决您的问题的自定义渲染管道,但请记住,如果这样做,您将付出额外的性能代价。
祝你好运。