12.三个输入数据节点

目的
认识三个输入节点
PixelNormalWS 和VertexNormalWS区别
自己写一个基础的Half-Lanbert和Phong光照模型
三个输入节点
输入节点

Camera Vector | 摄像机向量
摄像机向量我们也称之为观察方向 (V)
使用摄像机位置减去像素位置就可以计算出摄像机角度,他们是一样的。
UE5给我们封装好的摄像机向量。

PixelNormalWS | 法线向量
输入像素法线,称之为法线向量(N)

为什么不使用**VertexNormalWS,**后面有介绍二者区别
LightVector | 光照向量
这个节点是获取光照方向向量,简称 V

因为UE5使用的是Defferred Shading(延迟渲染),UE5官方文档建议我们不要使用,我们计算漫反射需要调用到怎么办?

参考资料 前向渲染与延迟渲染 - 知乎 (zhihu.com)

问题1 PixelNormalWS 和VertexNormalWS区别
7. Position位置节点 - 哔哩哔哩 (bilibili.com)
上面介绍了各个位置信息,其中就有这两个节点



前者计算法线贴图对法线方向的改变,后者只计算模型上点的法线方向。会忽略法线贴图。
这两个节点都是和法线有关,我们称之为法线向量(N)
测试
使用我们上面创建的Fresnel效果
PixelNormalWS

同样都有法线贴图,VertexNormalWS只会使用模型顶点法线


扩展 UE5给我提高了获取场景光照方向的节点,这里是自定义获取方法。 后面会单独介绍这个节点
计算光照模型
上面说到我们在材质编辑器无法获取光照方向,UE5提供给我们另一套解决方案。
创建一个蓝图里面增加一个平行光,在获取平行光的位置传入材质里。
思路
创建一个蓝图Actor

增加光源组件,我这里增加的是平行光。

拖到场景中,关闭默认的场景光

下一步就是创建材质,我们前简单了解一下Phong 和Half-Lanbert 光照模型。
Half-Lanbert 光照模型
半兰伯特和兰伯特相比,只是将法线向量与光照方向向量的点乘结果用一种更好的方式区间转化到了(0,1)区间:

法线方向(N)我们的节点,光照方向我们拿不到前使用一个向量代替。
公式
UE5实现Half-Lanbert 光照模型
创建一个材质,设置无光照

创建一个向量代替光照,我们等等使用蓝图获取光照方向。

带入公式就可以了,

带入公式,输出,就可以看到效果。
继续下一部分。
Phong光照模型
简单介绍一下,兰伯特光照模型,已经获取到了法线向量(N),光照向量(L),
Phong 光照模型 是计算观察方向(V)和反射方向(R) 这俩个向量。计算出高光的强弱。

Phong光照模型中主要的部分就是对高光的计算
公式 I(spcular) = pow(max(0,dot(R,V)), gloss)
V 就是观察方向,R是反射方向, 现在没有反射方向(R)
URP | Phong 和 Blinn-Phong光照光照模型 - 哔哩哔哩 (bilibili.com)
UE5 实现Phong光照模型
在上面那个材质的基础上,求出R反射方向,R为灯光对P点的镜面反射方向向量(R指代Reflection)

我们的目标就是通过已知的N向量和L向量 求解R向量,获得反射的方向。

我们先将L向量 乘以 -1,那么,根据反射定律可知, -L向量在水平方向的分量和R向量必然相等。
只要在-L向量上加两次,L向量在N向量上的投影向量,就可以获得R向量。
公式

套用高光公式

高光效果就实现了,

现在我们都计算完成,使用Add 把俩个叠加起来。

扩展 我们现在的光照向量是创建的一个向量节点固定的,下面获取场景光照数据。
我们创建一个材质参数集,创建这个是方便蓝图里计算出光照信息传到材质里。
材质里实时调用。
技术准备
材质参数集

有俩个一个是表量,一个是向量,我们这里创建向量。

命名 lightPos(光照位置)
打开一开始创建的蓝图,把平行光拖到Construction Script 里
蓝图里创建一个Set Vector Parameter Value 节点 把光照填进去保存。

材质关联灯光
把材质向量集拖到材质里,

在左边设置创建的变量。

使用摄像机位置减去模型本身的位置,就计算出光照向量(L)

替换所有的L

创建材质实例,指定到场景球体上。

效果完成。
总结
这个过程使用到了CameraVector (相机向量 V)和法线方向(N),也随便实现了光照向量(L)的输入计算。

对高光计算加深理解,怎么求出反射向量。

材质参数集的使用,这次是使用蓝图计算出结果传入到材质。

渲染方式,UE5是使用延迟渲染。那我们有没有简单的方法获取到场景灯光。
