fatislord 2021-11-17 17:22
浏览 141
已结题

[Unity Shader] 怎样将Deffered decal做的贴画效果一直显示在相机最前?

请教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渲染出的物体上,感觉就像穿透了一样,如下图。

img

可以看到彩色的贴花可以投在标准的Unity预制体上(白色的Shpere和Cube),但是直接穿透了自己编写的Shader渲染的物体(黑色带条纹的Cube),贴花Shader开了ZTest GEqual,自编写的物体Shader关了Cull。如果将贴花Shader的ZTest恢复为默认(LEqual),变成了如下图

img

可以看到贴花仍然没有正常的贴到自编写Shader物体的表面上,仅仅是因为Decal Projector本身的Mesh遮挡了一部分自编写Shader物体,使其投影在下方标准预制体上的贴花可以被相机看到(蓝色部分)。所以,问题又卡住了(暴风哭泣)。

还是请各位Shader专家能指条明路,万分感谢。

2021.11.17再更新
又想了下,我之前的那个想法应该是不对的,是我错误地理解了ScreenDepthTexture的含义,这个深度纹理里面只存储了相机能看到的深度数据,那些背面的、被挡住的、看不见的面片的深度数据早就被剔除或者覆盖了,所以不管怎么设置cull或者Ztest,在物体背面的Deferred Decal应该是看不到了,除非用黑科技能搞到一个储存了屏幕空间内所有面片深度信息的texture。

现在不知道大门是不是已经被焊死了,所以还是请各位Shader专家能够提些建议,比如有没有自己构建全局深度纹理这种奇技淫巧啥的,能让我死个明白,万分感谢。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月25日
    • 修改了问题 11月17日
    • 赞助了问题酬金 11月17日
    • 修改了问题 11月17日
    • 展开全部

    悬赏问题

    • ¥15 如何在炒股软件中,爬到我想看的日k线
    • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
    • ¥15 seatunnel 怎么配置Elasticsearch
    • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
    • ¥15 (标签-MATLAB|关键词-多址)
    • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
    • ¥500 52810做蓝牙接受端
    • ¥15 基于PLC的三轴机械手程序
    • ¥15 多址通信方式的抗噪声性能和系统容量对比
    • ¥15 winform的chart曲线生成时有凸起