c# - Unity:使用两个摄像头对单个图层进行灰度化也会对天空盒进行灰度化?
问题描述
我使用此处描述的技术对选定对象进行灰度化(通过将它们放置在不同的层上):http ://blog.theknightsofunity.com/using-multiple-unity-cameras-why-this-may-be-important/
但是,我找不到一种方法来做到这一点,它也不会对我的天空盒进行灰度化。根据我所知道的,这是有道理的——在第二台摄像机渲染颜色层之前,灰度化应用于天空盒清除的第一台摄像机图像。
需要明确的是,我的设置是这样的:
相机1:
- 深度 0
- 清晰的天空盒
- 剔除蒙版:包含我想要灰度化的对象的图层
相机 2:
- 深度 1
- 不清楚
- 剔除蒙版:除了我想要灰度的图层之外的所有内容
我尝试在这些上方和下方添加相机以尝试单独渲染天空盒,但根据我对绘制顺序的理解,这些都不起作用。
有人有什么建议吗?提前致谢!
PS - 如果它很重要(不认为它很重要),这个项目在 Unity 2019.2 中,我没有使用 LWRP/HDRP(现在不希望这样做)。
更新:响应@derHugo的回答——我试过这个,它似乎产生了所有的灰色(在回答之后第一次又一次尝试,结果相同)。据我了解,这些是 derHugo 建议的设置的屏幕截图;主凸轮是第一个(带有音频监听器),灰度凸轮是第二个:
解决方案
在该示例和您的情况下,天空盒是灰度的,因为您将灰度效果放在也渲染天空盒(清除标志)的同一台相机上。
既然你不希望你的天空盒被灰度化..让另一个未灰度化的相机渲染天空盒!
您只需要这两个相机:
主摄像头:
- 清除标志:天空盒
- 剔除蒙版:GrayscaleLayer 之外的所有内容
- 深度:0(小于 GreyscaleCamera 的深度)
灰度相机:
- 清除标志:不清除(除此处渲染的对象之外的所有内容都应“透明”)
- 剔除蒙版:仅 GreyscaleLayer
- 深度:1(任何大于 MainCamera 的深度)
Depth:
相机在绘制顺序中的位置。具有较大值的相机将被绘制在具有较小值的相机之上。
意味着首先将渲染 MainCamera。然后是它上面的 GreyscaleCamera。但是由于您使用Don't Clear
了深度缓冲区,因此其他图层上的对象(已经渲染)可能仍会出现在灰度对象的前面。并且由于您不清除未灰度化的天空盒,因此其他相机将简单地渲染并且以后不会更改。
当然,您还可以将 Skybox 进一步分离为第三个Culling Mask
没有任何内容的相机并将其设置为Depth = -1
.
简而言之:只要确保您的 Skybox(Background) Camera 始终具有最小值Depth
。
推荐阅读
- postgresql - 使用文件头将 CSV 文件导入 PostgreSQL
- javascript - 如何修改 angularjs 嵌入元素?
- typescript - Typescript 类型在具有附加属性时引发错误
- javascript - 如何从 Vue.js 中的 HTML 元素获取 id
- javascript - 代码结构 - 如何将文件(JS、PHP 等)包含在 HTML 中
- flutter - Flutter 在指纹和图案之间做出决定
- python - 尝试将模型与包含 null 的 DateField 一起使用时出错
- javascript - 将requirejs和plain js文件合并在一起
- go - 使用 Vscode 时如何使用“gocode”自动完成代码并使用“gopls”进行代码导航
- excel - 在 codeigniter 的 excel 下载功能中,Brak not in the loop 错误