Unity中OnRenderImage屏幕后处理做Graphics.blit时遇到的一个问题

目前在做一个小项目, 需要实现战争迷雾效果, 参考了很多文章, 有各种方案, 其中之一是使用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改名, 实验成功, 最终屏幕显示的是自己的纹理了.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值