生活小妙招之UE ViewPortUV-SceneTextureUV
后处理材质customNode中写SceneTextureLookup遇到了一些问题,做做记录
比如要在custom中写一个普通的镜像模糊,脑子都不带转的上来就直接这么写了,像是顺理成章的就应该这么写,并且网上随便搜UE咋写镜像模糊估计都是这样式的。
但是这样写其实是有问题的,实际遇到了俩问题
一是这样写,模糊宽度不是固定屏幕比例的,如下图视口缩小时,模糊范围变化了,正常我们希望的肯定是无论视口怎么缩放,整体模糊效果都是一致的。
二是镜像模糊是整体外扩的UV所以还好,但是遇到偏移UV的操作的时候,如果把offset加在
MobileSceneTextureLookup采样时的UV上,向左偏移时出现了黑边
以上俩个问题,材质中连连看的UVs传入前处理好传入,效果是正确的,没有缩放和黑边问题。所以就好奇这俩的区别是啥
一开始以为是写法有啥问题,所以看一下连连看的SceneTexture节点走的什么计算。自定义材质节点以前的文章有说过怎么写,直接定位
可以看到原生节点里面用的就是这几个函数,所以Mobile流程下custom可以这样写,和原生节点结果一样的
到这里也已经破案了,这说明MobileSceneTextureLookup输入的采样UV不是材质节点ScreenPosition这样一个显示窗口区域的全屏UV,而是一个带缩放偏移的结果,也就是说SceneColorMobile是没占满的,PC上截帧看确实是这样(实际绘制区域和各种设置相关,后面会提到)
所以从使用者角度看,custom中要写适配视口缩放和偏移不带黑边的采样SceneTexture,例如镜像模糊就该像下面这样写。
从使用者的角度,以上就欧克了。但是UE这套SceneColorMobile buffer大小和其中实际绘制区域大小的逻辑咱们还是带着疑问继续看一下。
一般情况下,UE这套流程是为了适配各种窗口缩放情况做的一套完整的屏幕适配流程,不同的显示器缩放设置,相机视口裁切都会影响SceneColorMobile buffer的大小,只是大部分情况我们不需要关心这些内容。但是有一个地方是有疑问且遇到点问题值得记录一下的,那就是这个连连看中的ViewSize
其返回的结果,是受显示器DPI缩放设置和引擎ScreenPercentage设置影响的。也就是说如果我使用的显示器DPI不是100%设置的情况下,其返回的结果是不引擎当前视口实际的像素尺寸大小。
假设有一个后处理材质我们需要在更改了显示器DPI缩放的情况下,获取当前相机视口实际显示区域占当前显示器的实际像素区域大小去做一些计算,也就是下图红色框区域大小的话,引擎默认是没有给这个返回结果的。但是好在ViewSize返回的结果是有包括相机视口裁切计算的,也就是说ViewSize节点消除掉DPI缩放影响返回的值就是希望的结果。
蓝图节点这个GetViewportSize返回的是上图蓝框的大小,并且运行时才有传参。
当然标准做法是材质里开个vec,逻辑侧计算然后传参就行,实际项目也都是这样操作的。
但是自己看的话就有个想法,能不能在连连看中弄个自定义节点返回上图红框的大小呢,如果OK的话editor下也能用。
之前看ViewportUVToSceneTextureUV函数中的计算的传参
这里这个ViewportSize和ViewSize节点返回的是一样的结果,那就顺着看这条传参的路子是不是有搞头呢。直接说结论,不行,因为Viewport Rect缩放的操作不是在后处理流程中算的,而是在最开始的流程中就设置好了。
那就再看下ViewSize节点的做法,也直接说结论,这块是可以操作的。
贴下能操作的地方,就不具体贴怎么改了
本地试了下,可以拓展FViewUniformShaderParameters和额外存一个去掉ScreenPercentage影响和DPI缩放影响的Rect,然后搞个自定义节点获取值返回即可。
但是,可以是可以,但是这些修改还是太不优雅了,考虑到实际情况材质中实际用到该信息的情况并不多。所以这块还是逻辑算好传给材质里的vec是最好的方式。
以上内容都是针对的PC上引擎Mobile流程,实际手机上的SceneColor buffer没有PC上这样那样的缩放操作。但是咱毕竟是在电脑上做东西预览效果,所以这块的了解还蛮有必要的~