Shader理论(1):光照模型

目录

前言

一、漫反射

1.1 兰伯特(lambert)模型

1.1.1 基本公式

1.1.2 物理原理

1.2 半兰伯特(half Lambert)模型

二、高光反射

2.1 Phong模型

2.1.1 基本公式

2.2 Blinn-Phong模型


前言

这是我给自己写的一个学习shader的笔记,首先第一部分是关于shader中涉及到的光照模型。

一、漫反射

1.1 兰伯特(lambert)模型

1.1.1 基本公式

漫反射光照计算符合兰伯特模型

diffuse = lightColor * _Diffuse * max(0, Dot(normalDir, lightDir)))

其中lightColor为光源颜色,_Diffuse为物体固有色,乘法的含义为颜色叠加(to do),normalDir为法线方向单位化向量,lightDir为入射光线方向单位化向量,两者点积的结果实际上为cosθ

其中max(0, dot(normalDir, lightDir))的值域为[0, 1],其函数对应关系如下图所示:

物体的背光面在计算时完全按照0值来计算,使得物体背光面细节丢失

因此漫反射光照符合兰伯特定律:反射光线的强度与表面法线和光源方向之间的夹角的余弦成正比

需要注意的是,该强度与相机位置,即观察者位置无关

1.1.2 物理原理

从物理能量的角度理解兰伯特经验公式

单位面积接收的光量和cosθ成正比

1.2 半兰伯特(half Lambert)模型

为了防止兰伯特模型背光面太暗导致细节观察丢失,使用修正模型的方式来改善效果。

具体修改部分为:

float halfLambert = dot(normalDir, lightDir) * 0.5 + 0.5;
diffuse = lightColor * _Diffuse * halfLambert;

此处halfLambert的值域为[0, 1],其函数对应关系如下图所示:

 物体的背光面处向量点积不为零,因此在背光面处也保留有细节

二、高光反射

2.1 Phong模型

2.1.1 基本公式

specular = lightColor * pow(max(0,cosθ),x)

其中lightColor为入射光颜色,θ为反射光与相机方向的夹角,x为指数次方,x越大,高光越集中

其次可以单独给高光加一个颜色specularColor,与入射光颜色叠加

specular = lightColor * specularColor * pow(max(0,cosθ),x)

2.2 Blinn-Phong模型

在Blinn模型的公式基础上,将θ从原先的反射光方向与视线方向的夹角改为了法线方向与入射光方向和视线方向角平分线方向(半程向量)的夹角。

猜你喜欢

转载自blog.csdn.net/qq_41904236/article/details/125123917