大家好!本人最近在使用Unity3D做master阶段的图形学实验平台。在实验过程中会频繁的对多个不同的RenderTexture(以下简称RT)进行一些运算,因此自然会用到Blit这个函数。在实验中,我们遇到了一些非常神奇的问题,希望能跟大家一起讨论一下。
Blit(src,dest,mat,pass)函数的作用,按照Unity官方API的说法是将src这个RT用mat这个材质中的某个pass渲染,然后复制到dest中。如果要给渲染加一些后处理效果(SSAO,HDR,bloom之类的),几乎可以肯定会用到这个函数。根据Unity自带文档中的例子,在OnRenderImage中调用Blit,然后用指定的mat渲染出来。OnRenderImage(src,dest)是Camera的一个回调(message),他会在camera执行渲染时候被调用,官方给的大部分Image Effect的实现都是用了这个回调。不过,经过最近的实验我发 在OnRenderImage里面不能多次调用Blit绘制多个不同的RT 。这个坑爹的问题困扰了本人很长时间...

也就是说形如:

  1. void OnRenderImage(RenderTexture src, RenderTexture dest ){
  2. Graphics.Blits(someRT, RT1, someMat, 1);
  3. Graphics.Blits(someRT, RT2, some,Mat, 2);

复制代码

这样的操作不会得到预计的效果。

考虑到可能是因为渲染管线 在一次Blit之后没有把render Target改成另外一个RT ,于是本人进行了多次实验,包括:

1.手动设置camera.targetTexture为要渲染的RT, 未果 。
2.在每次Blit之前加上RenderTexture.active = 要渲染的RT, 未果 。
3.在每次Blit之前设置Graphics.SetRenderTarget()为要渲染的RT, 未果 。

一气之下,本人怒写了一发Blit()的Brute实现...:

  1. static public void Blit(RenderBuffer COLOR,RenderBuffer DEPTH, Material MRTMat,int pass)
  2. {
  3. Graphics.SetRenderTarget(COLOR, DEPTH);
  4. RenderQuad (MRTMat, pass);
  5. }

复制代码

  1. static public void RenderQuad( Material MRTMat,int pass)
  2. {
  3. GL.PushMatrix();
  4. GL.LoadOrtho();
  5. MRTMat.SetPass(pass);
  6. GL.Begin(GL.QUADS);
  7. GL.TexCoord2(0.0f, 1.0f); GL.Vertex3(0.0f, 1.0f, 0.1f);
  8. GL.TexCoord2(1.0f, 1.0f); GL.Vertex3(1.0f, 1.0f, 0.1f);
  9. GL.TexCoord2(1.0f, 0.0f); GL.Vertex3(1.0f, 0.0f, 0.1f);
  10. GL.TexCoord2(0.0f, 0.0f); GL.Vertex3(0.0f, 0.0f, 0.1f);
  11. GL.End();
  12. GL.PopMatrix();
  13. }

复制代码

并且在Update中进行了调用,完全放弃了Unity那种在OnRendermage中做处理的模式。喜大普奔地发现问题竟然解决了...

通过多次试验,我们发现, 似乎在执行OnRenderImage这个回调过程中,一旦给摄像机设置了RenderTarget(也就是某个RT),在这一次回调中就不能再更改了。 我们在做了一个实验,在编辑器里手动给camera设置renderTarget,然后在OnRenderImage中执行:

  1. Blit(someRT, RT1, mat);
  2. Blit(someRT, RT2, mat);
  3. Blit(someRT, RT3, mat);
  4. Blit(someRT, RT4, mat);

复制代码

这样的操作。最后 只有手动设置的那张RT会被渲染,其他的都没有被渲染。 不知道这是不是Unity有意为之,还是说算一个Bug。

我们对这个问题的解决方法就是直接在Update中调用自己写的Blit函数,目前一切perfect。有意思的是,我们将所有摄像机都删除,只留下自己写的Blit,statics那里显示的Draw call数竟然是0...

欢迎大家一起就这个问题分享一下自己的看法,求大神讲解下这是为神马啊!!!

有关Unity3D的OnRenderImage()和Blit()的一些问题

有关Unity3D的OnRenderImage()和Blit()的一些问题相关推荐

  1. Graphics.Blit

    参考:官方文档 https://docs.unity3d.com/ScriptReference/Graphics.Blit.html public static void Blit(Textures ...

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

    目前在做一个小项目, 需要实现战争迷雾效果, 参考了很多文章, 有各种方案, 其中之一是使用camera的后处理技术显示迷雾纹理. 于是实验了一下, 创建个cs脚本, 响应OnRenderImage方 ...

  3. 【Unity3d Shader】景深效果

    摄影常用的一招就是背景虚化,背景虚化的相片可以突出拍摄主题,强调自己要展现的事物. 摄影技巧为:1,开大光圈:2,拉长焦距:3,主体离镜头近:4,背景离主体远 有了背景虚化,照片会变的有艺术感见下图( ...

  4. 【Unity3D】水波特效

    1 水波特效原理 水波特效属于 Unity3D 后处理特效,其原理是:对渲染后的纹理进行局部挤压和拉升变换,即对局部 uv 坐标进行周期性的偏移运动,实现波纹效果. 1)波形方程 为简化水波模型,我们 ...

  5. [技美CG]Unity3D复刻UnityShader 之 ShaderToy - Bubbles

    Unity3D复刻UnityShader 之 ShaderToy - Bubbles 背景: 官方地址/参考资料: ShaderToy-Bubbles原始代码: Unity复刻开始 核心显示类: 核心 ...

  6. 【Unity3D Shader编程】之九 深入理解Unity5中的Standard Shader (一)屏幕水幕特效的实现

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/49556461 作者:毛星云(浅 ...

  7. Unity3D Shader系列之描边

    目录 1 引言 2 顶点沿法线外拓方式 2.1 法线外拓+ZTest Always 2.1.1 代码 2.1.2 问题点 2.2 法线外拓+Cull Front 2.2.1 代码 2.2.2 改进点 ...

  8. 【Unity3D】选中物体描边特效

    1 前言 描边的难点在于如何检测和识别边缘,当前实现描边特效的方法主要有以下几种: 1)基于顶点膨胀的描边方法 在 SubShader 中开 2 个 Pass 渲染通道,第一个 Pass 通道渲染膨胀 ...

  9. CommandBuffer.Blit BuiltinRenderTextureType.CameraTarget为空的问题

    Forward模式下,当使用CommandBuffer来实现后处理的时候,发现cb.Blit(BuiltinRenderTextureType.CameraTarget,...)无效,在FrameDe ...

最新文章

  1. VS2010 发布web项目 问题
  2. 【数据结构】B-Tree, B+Tree, B*树介绍
  3. python 存入数据库bigint_【Python】从0开始写爬虫——把扒到的豆瓣数据存储到数据库...
  4. Java中input与output_java中的Io(input与output)操作总结(四)
  5. java hotswap_DCEVM+HotSwapAgent实现java类热加载
  6. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性
  7. .Net转Java自学之路—SpringMVC框架篇八(RESTful支持)
  8. linux80端口检查,Linux下基于端口的服务检查脚本
  9. 444. Sequence Reconstruction
  10. 谷歌推出TensorFlow Lattice,让机器学习模型适应总体趋势
  11. 理解用户模式(User Mode)和内核模式(Kernel Mode)
  12. Oracle----MLDN
  13. ISO9660文件系统分析
  14. 计算机室英语单词怎么读,“计算机”英语单词怎么读?
  15. Stream和方法引用
  16. 【牛客】前端工程师-HTML专项练习知识点整理(一)
  17. 10. 利用vs2017中的lib.exe把def文件生成lib文件
  18. 织梦标签调用:最新文章、相关文章、推荐文章、热点文章、头条
  19. 【素描教程】简单的素描静物步骤详…
  20. VS2022无法打开Silverlight 项目的问题:改用VS2015

热门文章

  1. FastQC安装以及试用
  2. 【存储知识】文件系统与硬盘存储(分区、格式化、挂载、inode、软链接与硬链接)
  3. 2022-03-15 工作记录--PHP-判断数组的长度 + 展示数组的长度
  4. AndroidID、IMEI、OAID获取
  5. 软件工程应用与实践(2)——application.properties配置文件分析
  6. 什么是云计算和大数据?他们之间的区别是什么?
  7. div onload()
  8. 06-谷粒商城项目 人人开源快速开发 renren-fast前后端联调 逆向工程搭建&使用
  9. 三星证实遭黑客入侵:Galaxy手机源代码泄露
  10. 什么是OsmocomBB