距离上一次学习shader已经过去六十多天了,惭愧惭愧。

接着上次看书的地方接着学习,这次我学习的是标准光照模型:自发光,漫反射光,高光反射,环境光。

环境光:

在真实的世界中,除了直接光照,物体也可以被间接光照所照亮,间接光照指的是,光线通常会在多个物体之间反射。

unity中使用环境光来近似模拟间接光照,是一个全局变量,即场景中的所有物体都使用这个环境光。

自发光:

通常在实时渲染中,自发光的表面往往并不会照亮周围物体的表面,也就是说这个物体不会被作为一个光源。

直接使用物体材质的颜色。

漫反射:

漫反射光照符合兰伯特定律:反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比(我看到这句话后思考了十分钟,然后就睡着了)

unity urp 相机 没有自发光 unity自发光shader_环境光

原理公式:diffuse = I*cosθ;

    diffuse:反射光线的的光强;

    I:入射光线的光强,方向如上图所示;

    cosθ:入射光线和该顶点法线的余弦,如上图所示;cosθ = L*N;

        所以,最后的数学表达式为:diffuse = I*(L*N);


其实除了漫反射还有一个半漫反射,据说首先是 半条命 中应用的。

正常的漫反射公式(Lambert)是这样的:
C(diffuse) = C(light) * M(diffuse)max(0,n*I)
C(light):入射光的颜色和强度
M(diffuse):材质的漫反射系数
n:世界坐标系下的表面法线
I:世界坐标系下的光源方向(反射点指向光源的矢量)max函数:,将结果截取到0,防止法线与光源方向的点乘为负值,被背后的光源照亮的错误效果

 
C(diffuse) = (C(light) * M(diffuse))(0.5(n*l)+0.5)


这个公式实现的漫反射效果看起来更真实一些(据说是让亮度更亮一点,特别是比较暗的地方)

高光反射:

这里的高光反射是一种经验模型,也就是说他并不完全符合真实世界的高光反射现象。它可用于计算那些沿着完全镜面反射方向被反射的光线,这样可以看起来更有光泽。

计算高光反射需要知道的信息比较多,如表面法线、视角方向、光源方向、反射反向等

unity urp 相机 没有自发光 unity自发光shader_环境光_02

逐顶点和逐像素:

在片元着色器中计算,被称为逐像素光照(Phong插值);

在顶点着色器中计算,被称为逐顶点光照(高洛德着色)。

逐顶点的计算量往往要小于逐像素的计算量。