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

更新时间:2023-05-07 17:01:22 阅读: 评论:0

有关Unity3D的OnRenderImage()和Blit()的⼀些问题⼤家好!本⼈最近在使⽤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。这个坑爹的问题困扰了本⼈很长时间...
也就是说形如:
01. void OnRenderImage(RenderTexture src, RenderTexture dest ){
02.
03. Graphics.Blits(someRT, RT1, someMat, 1);
04. 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实现...:
01. static public void Blit(RenderBuffer COLOR,RenderBuffer DEPTH, Material MRTMat,int pass)
02.        {
03.                Graphics.SetRenderTarget(COLOR, DEPTH);
04.                RenderQuad (MRTMat, pass);
05.        }
复制代码
01. static public void RenderQuad( Material MRTMat,int pass)
02.        {
03.
04.                GL.PushMatrix();
05.                GL.LoadOrtho();
06.                MRTMat.SetPass(pass);
07.                GL.Begin(GL.QUADS);
08.                GL.TexCoord2(0.0f, 1.0f); GL.Vertex3(0.0f, 1.0f, 0.1f);
09.                GL.TexCoord2(1.0f, 1.0f); GL.Vertex3(1.0f, 1.0f, 0.1f);
10.                GL.TexCoord2(1.0f, 0.0f); GL.Vertex3(1.0f, 0.0f, 0.1f);
11.                GL.TexCoord2(0.0f, 0.0f); GL.Vertex3(0.0f, 0.0f, 0.1f);
12.                GL.End();
13.                GL.PopMatrix();
14. }
复制代码
并且在Update中进⾏了调⽤,完全放弃了Unity那种在OnRendermage中做处理的模式。喜⼤普奔地发现问题竟然解决了...
通过多次试验,我们发现,似乎在执⾏OnRenderImage这个回调过程中,⼀旦给摄像机设置了RenderTarget(也就是某个RT),在这⼀次回调中就不能再更改了。我们在做了⼀个实验,在编辑器⾥⼿动给camera设置renderTarget,然后在OnRenderImage中执⾏:
01. Blit(someRT, RT1, mat);
02. Blit(someRT, RT2, mat);
03. Blit(someRT, RT3, mat);
04. Blit(someRT, RT4, mat);
复制代码
这样的操作。最后只有⼿动设置的那张RT会被渲染,其他的都没有被渲染。不知道这是不是Unity有意为之,还是说算⼀个Bug。
我们对这个问题的解决⽅法就是直接在Update中调⽤⾃⼰写的Blit函数,⽬前⼀切perfect。有意思的是,我们将所有摄像机都删除,只留下⾃⼰写的Blit,statics 那⾥显⽰的Draw call数竟然是0...
欢迎⼤家⼀起就这个问题分享⼀下⾃⼰的看法,求⼤神讲解下这是为神马啊

本文发布于:2023-05-07 17:01:22,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/866327.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:渲染   实验   问题   平台   普奔地   发现   解决   摄像机
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图