大家好!本人最近在使用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 。这个坑爹的问题困扰了本人很长时间...
也就是说形如:
这样的操作不会得到预计的效果。
考虑到可能是因为渲染管线 在一次Blit之后没有把render Target改成另外一个RT ,于是本人进行了多次实验,包括:
1.手动设置camera.targetTexture为要渲染的RT, 未果 。
2.在每次Blit之前加上RenderTexture.active = 要渲染的RT, 未果 。
3.在每次Blit之前设置Graphics.SetRenderTarget()为要渲染的RT, 未果 。
一气之下,本人怒写了一发Blit()的Brute实现...:
并且在Update中进行了调用,完全放弃了Unity那种在OnRendermage中做处理的模式。喜大普奔地发现问题竟然解决了...
通过多次试验,我们发现, 似乎在执行OnRenderImage这个回调过程中,一旦给摄像机设置了RenderTarget(也就是某个RT),在这一次回调中就不能再更改了。 我们在做了一个实验,在编辑器里手动给camera设置renderTarget,然后在OnRenderImage中执行:
这样的操作。最后 只有手动设置的那张RT会被渲染,其他的都没有被渲染。 不知道这是不是Unity有意为之,还是说算一个Bug。
我们对这个问题的解决方法就是直接在Update中调用自己写的Blit函数,目前一切perfect。有意思的是,我们将所有摄像机都删除,只留下自己写的Blit,statics那里显示的Draw call数竟然是0...
欢迎大家一起就这个问题分享一下自己的看法,求大神讲解下这是为神马啊!!!
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 。这个坑爹的问题困扰了本人很长时间...
也就是说形如:
这样的操作不会得到预计的效果。
考虑到可能是因为渲染管线 在一次Blit之后没有把render Target改成另外一个RT ,于是本人进行了多次实验,包括:
1.手动设置camera.targetTexture为要渲染的RT, 未果 。
2.在每次Blit之前加上RenderTexture.active = 要渲染的RT, 未果 。
3.在每次Blit之前设置Graphics.SetRenderTarget()为要渲染的RT, 未果 。
一气之下,本人怒写了一发Blit()的Brute实现...:
并且在Update中进行了调用,完全放弃了Unity那种在OnRendermage中做处理的模式。喜大普奔地发现问题竟然解决了...
通过多次试验,我们发现, 似乎在执行OnRenderImage这个回调过程中,一旦给摄像机设置了RenderTarget(也就是某个RT),在这一次回调中就不能再更改了。 我们在做了一个实验,在编辑器里手动给camera设置renderTarget,然后在OnRenderImage中执行:
这样的操作。最后 只有手动设置的那张RT会被渲染,其他的都没有被渲染。 不知道这是不是Unity有意为之,还是说算一个Bug。
我们对这个问题的解决方法就是直接在Update中调用自己写的Blit函数,目前一切perfect。有意思的是,我们将所有摄像机都删除,只留下自己写的Blit,statics那里显示的Draw call数竟然是0...
欢迎大家一起就这个问题分享一下自己的看法,求大神讲解下这是为神马啊!!!