关于creator实现优化后的高斯模糊逻辑问题

研究了一天,终于实现了采取将高斯核分为行列各一次卷积的方式来做高斯核计算的优化。

但现在有这么一个情况,因为creator好像不支持将前一个片源着色器的输出直接作为下一次片元着色器的纹理输入,所以采用了网上提供的一种截屏的方式来实现。但这么做的坏处意味着,我们需要对目标的纹理产生了2次drawcall。

据说unity那边有好办法,但creator这边似乎还不支持。

那我想了解一下,对于一个1280*720规格的纹理,以及同等大小的屏幕进行一次上述方式的高斯模糊和只用一般方式走一个二层循环直接在一个着色器里实现的高斯模糊,哪个效率会高一点呢?

没有明白 2种方式的意思

例如我要做一个7X7的高斯模糊,简单的方式就是修改着色器,一个点进行77次采样然后进行卷积。
而优化方式就是先用一次1x7的卷积,得到一个中间纹理,然后再进行一次7
1的卷积得到最后的结果。

所以需要比较一次n^2的着色器draw,和2次n的着色器的draw,哪个效率更高。

或者换个问题,着色器里的循环次数要达到什么数量级,可以抵得上一次draw的调用开销。

个人认n^2 比 2次n好, 别忘了, 分两次n的处理, 中间还有上下文之的额外开销, 怎麽算都没有一次过好

总觉得不能一概而论。
毕竟对一个20481536的图进行高斯模糊,与一个640360的图进行高斯模糊的运算量是完全不同的。
对于GPU来说几百万次浮点数加法乘法啥的可能跟没有一样。但以2048*1536这种级别的图来看,需要1.5亿次操作。使用优化后,可以少进行大约一亿次。
这个一亿次运算的开销比调用一次draw的开销还要大吗?

纯讨论,因为我确实到现在都不太清楚GPU的运算速度,与调用draw的时间开销都是怎么一个水平。
毕竟大多数地方也只会告诉你,gpu运算很快,draw会相对很耗时间。有多快,draw有多耗费时间没找到有量化的文章。

直接用像素偏移下,截帧叠加,效果比卷积的高斯要好很多,性能也比高斯好

能具体说一下嘛,或者给一下片元着色器的采样那块儿的写法

image shader的函数大致是这样,offset是偏移的值,size是作用的图片的尺寸,使用这个shader后,截帧八到十次去重复刷材质,可以达到PS的高斯模糊效果,比单纯一次pass的效果好很多

呃。。。这样啊。。。那这个是要看需求的。

着色器的事暂且不谈。
我比较好奇的是你说的截帧是指什么意思?是说调用你这个算法那么多次?还是说用输出作为新纹理返回来再多次使用你的着色器?如果是后者,那这边用creator是怎么去实现的呢?不会是反复draw那么多次吧?那这个效率简直就不能忍了

U3D的高斯也是多pass重复绘制呀,如果你考虑性能那就不要用高斯,高斯本身就是最费性能的

参考ue的追光的方法。上一帧的输出作为下一帧的输入模糊然后继续给下一帧,做个简单的逻辑循环,效果爆炸。

道理都懂,其实现在的问题时creator怎么去实现这种方式

这就是我现在用的办法

主要是想了解,creator这边是怎么把片源的输出,重新再传一次给片源的。
中间是否会涉及到额外的drawcall,性能如何

如果你不改引擎的话,只能用RenderTexture实现多pass,性能小程序没试过,原生倒是OK,如果你怕一瞬间性能不好,可以分多帧去RenderTexture,dc是不会多的,都是顶掉的,就是费点GPU

懂了,非常感谢