目前在做一个小项目, 需要实现战争迷雾效果, 参考了很多文章, 有各种方案, 其中之一是使用camera的后处理技术显示迷雾纹理.
于是实验了一下, 创建个cs脚本, 响应OnRenderImage方法, 把脚本添加到camera上.
在OnRenderImage中加了一句Graphics.blit(source, destination, mat)
我的理解就是, source是屏幕图像, destination就是最终显示的图像, 中间的处理是在mat中做. 我理解mat就是shader和纹理的一个包装. 所以需要一个纹理图和shader
于是准备好一张纹理图, 写个shader处理这个纹理图. shader很简单, 就是取纹理的颜色直接返回.
然后shader和纹理加到材质里. 纹理是赋给了_MainTex. 再把材质赋给这个cs(也可以手动创建, 我是外面创建好, 然后赋给脚本的成员变量)
按我的理解最终显示的应该是我赋给材质的那张纹理.
但是结果出乎意料, 显示的还是原来屏幕. 为什么我的纹理图没有显示呢?
开始以为自己哪里写错了, 各种调试, 实验. 去掉这句话, 显示黑屏没问题, 证明OnRenderImage是工作的. 返回纯颜色显示也没问题, 证明shadert也是工作的.
百思不得其解.
那么为什么不显示我的纹理, 却显示原来的屏幕图像呢?
原来问题出现在blit的工作方式上, blit默认是把source赋给材质的_MainTex. 所以你处理的纹理实际是source而不是你自己设置的纹理. 除非把_MainTex改名, 或者source设为null.
以前看到过例子source是在cs里手动设置给_MainTex的. 这个误导了我, 以为必须手动设置. 其实不必, 官方文档也有说明
于是把_MainTex改名, 实验成功, 最终屏幕显示的是自己的纹理了.