Unity 上的模板命令仅用于使像素不可见还是更多?

Posted

技术标签:

【中文标题】Unity 上的模板命令仅用于使像素不可见还是更多?【英文标题】:Is stencil command on Unity used only for making pixels invisible or is it more? 【发布时间】:2021-12-08 21:32:42 【问题描述】:

我想要一个在特定网格内时显示为灰色(灰度)的对象。目前,我已经关注了一些视频,并在着色器中使用了 stencil 命令使其在网格内部(或外部)不可见,但这并不是我想要的。

我怎样才能使对象在特定的网格渲染器中被视为原样,而在其外部时具有灰度效果?是否可以在 Unity 着色器上使用模板来做到这一点?

【问题讨论】:

【参考方案1】:

Unity - Sharderlab - Stencil

模板缓冲区为每个像素存储一个 8 位整数值 在帧缓冲区中。在执行片段着色器之前 对于给定的像素,GPU可以将模板缓冲区中的当前值给定的参考值进行比较。这称为模板测试。如果模板测试通过,GPU 将执行深度测试。如果模板测试失败,GPU跳过该像素的其余处理。这意味着您可以使用模板缓冲区作为掩码来告诉 GPU 绘制哪些像素,以及丢弃哪些像素。

一般来说还有更多关于它的信息,例如在Wikipedia - Stencil Buffer。

简而言之:基本上,它用于告诉着色器通道不要根据给定条件覆盖某些像素,并允许它们将某个值写入模板缓冲区以用于渲染像素本身。

See Through Objects with Stencil Buffers using Unity URP 是一个很好的解释和示例用例。


针对您的特定用例

我怎样才能使对象在特定的网格渲染器中被视为原样,而在其外部时具有灰度效果?

您可能想看看Creating Overlap Shader Effects, Such as Underwater and Night Vision, in Unity's Shader Graph,它使用了 ShaderGraph 和深度测试。

【讨论】:

感谢您的回答,非常感谢!尽管您发送链接的文章并不完全符合我的要求。它很接近,但我希望效果可以逆转。我想在外面而不是在里面产生效果。

以上是关于Unity 上的模板命令仅用于使像素不可见还是更多?的主要内容,如果未能解决你的问题,请参考以下文章

如果仅单击五个影片剪辑(不是更多),如何使影片剪辑可见

如何使某个模板仅对 Django 中已确认的用户可见?

淡入/淡出的简单切换不适用于过渡、不透明度和可见性

仅针对在模板生成的 html 列表中单击的项目的 Jquery 切换(可见/不可见)

unity 3D里用NGUI,sence场景里创建panel,在场景里边不可见,为什么呀?

粉丝页面上的 Facebook Like Widget,评论区域超出可见区域