使用雪碧图在Unity中对3D对象进行遮罩

3

我有一个png图像,希望它可以作为透明遮罩使用,在场景中完全透明,但是位于其后面的3D对象不会被显示(类似于精灵遮罩,但需要与3D对象一起使用)。

因此,我将图像作为点状精灵(无滤波器)添加到我的3D场景中,并已经应用了着色器到精灵材质上,但是它并没有正常工作。看起来像是边界处的像素没有被"正确地"剪切。

我之所以使用这种方法,是因为Unity内置的"2D精灵遮罩"只影响使用Sprite Renderer的对象(如此处所述https://docs.unity3d.com/Manual/class-SpriteMask.html),但我想它影响3D对象。

因此,这是着色器:

    Shader "Masked/Mask" {
 
     SubShader {
         Tags {"Queue" = "Geometry+10" }
         ColorMask 0
         ZWrite On
         Pass {}
     }
 }

这是用作遮罩的精灵(png 图像): 遮罩精灵 这是我想要的结果与实际结果的比较: 比较结果 我不太擅长着色器,所以想知道是否有代码修改可以改善结果。我已经尝试使用不同格式的精灵图像(png、tif、压缩),但结果都相同。

这里有一个可能对你有帮助的资源。https://docs.unity3d.com/Manual/class-SpriteRenderer.html 查看遮罩交互部分。 - Branden
“Mask Interaction” 部分是关于使用预先构建的“Sprite Masks”,它仅影响使用 Sprite 渲染器的对象,而不影响 3D 对象。 - lekoman
1个回答

0

我曾使用“透明”的3D遮挡物和渲染优先级做过类似的事情,我想在精灵方面应该也是类似的...

  1. 渲染不可挡住的几何体(包括Sprite){"Queue" = "Geometry"}
  2. 渲染可挡住的几何体 {"Queue" = "Geometry+1"}

严格来说,只有当你的遮挡物(精灵)始终是透明的时候,它才需要渲染到深度(Z)缓冲区。


实际上,当应用于3D遮挡物时,着色器效果良好。问题在于我正在使用精灵来遮挡3D对象。 - lekoman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接