请教Unity Shader的技术专家,我想做一个可以一直显示在镜头最前的贴花效果,用于展示物体背面的一些情况(比如被枪击、触摸等),我参照了puppet_master的帖子做了个Deferred decal的shader, 可是尝试着把decal shader的ZTest、ZWrite等参数off后,发现贴花效果还是会被其他物体或者是被贴花物体本身挡住,把Shader的渲染队列改为最后排的Overlay也不管用。我是个计算机图形学初学者,可能对Unity shader的渲染机制还不是很了解,所以想请教一下各位有没有什么办法,可以让Deferred decal的贴花效果一直显示在镜头最前呢?谢谢!
2021.11.17更新
后来想了下,感觉物体背面的decal不显示是因为被贴花物体的背面面片都被剔除了,这时候相机的深度缓存中没有被贴花物体背面面片的深度数据,自然没有办法在Deferred Decal Shader里计算出贴花(参考https://blog.csdn.net/puppet_master/article/details/84310361的原理),如果想要背面的面片,把物体Shader里的Cull给off不就行了?想到这块后欣喜若狂,开了Unity一试还是不行,试出来的结果好像是Deferred decal投不到不到自己编写的物体Shader渲染出的物体上,感觉就像穿透了一样,如下图。
可以看到彩色的贴花可以投在标准的Unity预制体上(白色的Shpere和Cube),但是直接穿透了自己编写的Shader渲染的物体(黑色带条纹的Cube),贴花Shader开了ZTest GEqual,自编写的物体Shader关了Cull。如果将贴花Shader的ZTest恢复为默认(LEqual),变成了如下图
可以看到贴花仍然没有正常的贴到自编写Shader物体的表面上,仅仅是因为Decal Projector本身的Mesh遮挡了一部分自编写Shader物体,使其投影在下方标准预制体上的贴花可以被相机看到(蓝色部分)。所以,问题又卡住了(暴风哭泣)。
还是请各位Shader专家能指条明路,万分感谢。
2021.11.17再更新
又想了下,我之前的那个想法应该是不对的,是我错误地理解了ScreenDepthTexture的含义,这个深度纹理里面只存储了相机能看到的深度数据,那些背面的、被挡住的、看不见的面片的深度数据早就被剔除或者覆盖了,所以不管怎么设置cull或者Ztest,在物体背面的Deferred Decal应该是看不到了,除非用黑科技能搞到一个储存了屏幕空间内所有面片深度信息的texture。
现在不知道大门是不是已经被焊死了,所以还是请各位Shader专家能够提些建议,比如有没有自己构建全局深度纹理这种奇技淫巧啥的,能让我死个明白,万分感谢。