添加环境光

球谐光照计算公式

https://zhuanlan.zhihu.com/p/351289217

球谐光照SH代码

UE没有对应的SH节点,所以需要创建自定义节点调用

代码

float4 NormalVector = float4(Normal, 1.0f);
float3 Intermediate0, Intermediate1, Intermediate2;

Intermediate0.x = dot(View.SkyIrradianceEnvironmentMap[0], NormalVector);
Intermediate0.y = dot(View.SkyIrradianceEnvironmentMap[1], NormalVector);
Intermediate0.z = dot(View.SkyIrradianceEnvironmentMap[2], NormalVector);

float4 vB = NormalVector.xyzz * NormalVector.yzzx;
Intermediate1.x = dot(View.SkyIrradianceEnvironmentMap[3], vB);
Intermediate1.y = dot(View.SkyIrradianceEnvironmentMap[4], vB);
Intermediate1.z = dot(View.SkyIrradianceEnvironmentMap[5], vB);

float vC = NormalVector.x * NormalVector.x - NormalVector.y * NormalVector.y;
Intermediate2 = View.SkyIrradianceEnvironmentMap[6].xyz * vC;

return max(0, Intermediate0 + Intermediate1 + Intermediate2);

环境光混合处理

传入法线数据计算SH环境光后进行混合颜色以及强度控制

最终输出直接使用加法混合即可,加上漫反射和高光。因为亮度会增加可能导致高光效果不明显,所以这里将高光部分大于1的部分在加一遍对高光提亮

当前效果

左边是加了环境光的,右侧是没有环境光的