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截图发现在后处理之前明显有问题的坏点
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代码中也能直观看到
TangentToWorld是Orthonormal rotation-only transform from tangent space to world space
正交矩阵,那么WorldVertexNormal也是单位向量才对
但是,这个坏点debug信息看到的是这样的
这个v1就是TangentToWorld[2],这不是单位向量啊
这样的话dot值就不在理想区间内了,后面power爆炸就出现了
那么问题定位到了为什么TangentToWorld不是个正交矩阵了
到这里又去看顶点工厂的usf已经基本没有什么思路了……唯一能把握的只有原生4.27没问题,但是我们项目并没有改过插值这部分……
然后发现虽然basepass里面顶点值已经错了,但是坏点是在resolve之后出现的
= =于是大佬一拍桌子,想起来在桌面端的ES模式下依然是打开了MSAA的
但4.27默认不是,于是在4.27下打开了MSAA后,奇妙的坏点也出现啦
最后leader说,为了能在PC上预览到接近PC的效果,哪怕是ES模式也打开了MSAA,但手机上是不会开的,PC端不使用ES模式也不会有问题,所以可以当做没问题……
最后的解决方案就是不用管-=-
以上我全程在打酱油,我键盘的参与度都比我本人高……(菜鸡落泪
遗留问题
- 插值计算错误是确定MSAA导致的吗?
- 如果不是MSAA导致的差值错误,那么是为什么错误的?
- UE4 MSAA的应用阶段?
总结收获
当然还是有所收获的
- 翻到了大部分usf和ush,之前完全没看过Shaders这部分的源码
- 能自己去看HLSL了(大概吧
- 知道RenderDoc的debug了,并了解了几个汇编指令