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 上的模板命令仅用于使像素不可见还是更多?的主要内容,如果未能解决你的问题,请参考以下文章
仅针对在模板生成的 html 列表中单击的项目的 Jquery 切换(可见/不可见)