UE4:材质节点VertexNormalWS输入的一个小问题

前言

我们的TA大佬手上任务比较多,抛给我一个小问题希望我帮忙查一下。

有一个材质在我们某次修改引擎后不正常了,但是不知道是什么时候开始不正常的。将这个材质用到公版4.27的项目上又没有问题,需要定位一下问题并解决。

遗憾的是本人在这次问题定位中几乎并没有干任何事-=-最后都是靠leader和别的大佬解决的……

菜的哭出声QWQ

具体问题

TA大佬给了我一个简化后的由来查问题的材质

问题材质

ShadingModel为unlit,ES3.1下长这个样子

材质预览

问题是,在我们的引擎版本里,边缘部分在某些情况下会有闪烁的亮点,如下图

问题

解决过程

因为大佬说在4.27的release版本是正常的,不确定是改什么坏掉了

首先我怀疑是Shader相关的改动造成的问题,我将我们的引擎源码的Shaders文件夹和4.27的Shaders文件夹进行了Diff,幸好差异也就三十多个文件……= =

凭借之前看过一些Shader和材质的东西,简单判断了一下哪些大概可能是相关的,将这部分回退release版本,对shader进行了重新编译,再次打开引擎后发现

完全没有用,问题依然存在

在我疯狂Diff折腾了一下午未果的情况下,我求助了另一位被我抓住他有空的TA大佬- -

然后大佬教我RenderDoc Debug一下坏点,看看值

最后惊讶的发现,在power节点前的值是一个大于1的数,取了5次方之后值大得离谱以至于Emissive Color收到的值巨大,最后在Bloom之后就形成了这个亮光闪烁的样子

RenderDoc截取

图为RenderDoc截图发现在后处理之前明显有问题的坏点

Debug

power后的值非常大

再往前看

材质节点

这里大佬跟我说,理论上两个向量都应该是单位向量,dot结果应该在-1到1区间

两个节点都是FMaterialPixelParameters的成员

其中CameraVector是 Normalized world space camera vector, which is the vector from the point being shaded to the camera position.

是单位化的

而WorldVertexNormal其实是TangentToWorld[2],在HLSL代码中也能直观看到
WorldVertexNormal

TangentToWorld是Orthonormal rotation-only transform from tangent space to world space
正交矩阵,那么WorldVertexNormal也是单位向量才对
但是,这个坏点debug信息看到的是这样的

Debug

这个v1就是TangentToWorld[2],这不是单位向量啊

这样的话dot值就不在理想区间内了,后面power爆炸就出现了

那么问题定位到了为什么TangentToWorld不是个正交矩阵了

到这里又去看顶点工厂的usf已经基本没有什么思路了……唯一能把握的只有原生4.27没问题,但是我们项目并没有改过插值这部分……

然后发现虽然basepass里面顶点值已经错了,但是坏点是在resolve之后出现的

resolve前

resolve后

= =于是大佬一拍桌子,想起来在桌面端的ES模式下依然是打开了MSAA的

但4.27默认不是,于是在4.27下打开了MSAA后,奇妙的坏点也出现啦

最后leader说,为了能在PC上预览到接近PC的效果,哪怕是ES模式也打开了MSAA,但手机上是不会开的,PC端不使用ES模式也不会有问题,所以可以当做没问题……

最后的解决方案就是不用管-=-

以上我全程在打酱油,我键盘的参与度都比我本人高……(菜鸡落泪

遗留问题

  1. 插值计算错误是确定MSAA导致的吗?
  2. 如果不是MSAA导致的差值错误,那么是为什么错误的?
  3. UE4 MSAA的应用阶段?

总结收获

当然还是有所收获的

  1. 翻到了大部分usf和ush,之前完全没看过Shaders这部分的源码
  2. 能自己去看HLSL了(大概吧
  3. 知道RenderDoc的debug了,并了解了几个汇编指令

UE4:材质节点VertexNormalWS输入的一个小问题
http://muchenhen.com/posts/49950/
作者
木尘痕
发布于
2022年7月28日
许可协议