首先要声明:
下述内容并不严谨
物理学知识我也不是很深入,只是为了方便自己理解
平行光下的漫反射公式:
<漫反射光颜色>=<入射光颜色>×<表面基底色>×cosθ
cosθ如下图所示
漫反射光颜色、入射光颜色、表面基底色
在shader中都是vec4类型
一般会把vec4理解为空间向量,再加上上图的箭头,我第一次就犯迷糊了
把上面3种颜色都想象成空间向量,一直无法理解上述公式
其实,webgl引入这种“漫反射模型”,是为了更好的模拟现实世界的光照效果
而现实世界的光照效果就涉及到物理学知识
解释“漫反射公式”只能从物理角度来解释!!
下面就是我的猜测(没有严格的物理公式推导)
颜色一般表示为如下:
rgb三个通道值的范围是[0,255]
这个取值范围是因为用了8个字节来存储每个通道的值而已
上述颜色一般又可以表示为
rgb(153/255, 170/255, 85/255)
运算结果为:
rgb(0.6, 0.667, 0.334)
这下就豁然开朗了!
这个颜色值可以进行这样的物理解释(不严谨):
我们建立一个模型:
物体并不会发光,而是吸收一部分光、反射一部分光
反射的光是我们看到的颜色,也就是我们可以通过反射率来量化物体的颜色
假设有一束光照射到物体,物体吸收了40%,那么物体必然反射60%
物体的颜色就是60%,即0.6
因为一个光是由3部分组成:红光、绿光、蓝光
那么一个物体的颜色,就是这个物体对红光、绿光、蓝光的反射率的体现
我们并没有把rgb相加,而是独立的记录和分析
是因为rgb三个是独立的,并且不是简单相加的关系
根据上面的模型,就可以理解下面公式的前半部分(加粗部分)
<漫反射光颜色>=<入射光颜色>×<表面基底色>×cosθ
顺带说一下
vec4 a;
vec4 b
vec4 c=a×b
上面的乘号不是数字的乘号,因为a、b都是向量,不是简单的数字
他们有自己的运算规则:
c的第1个分量是a的第1个分量乘以b的第1个分量
c的第2个分量是a的第2个分量乘以b的第2个分量
c的第3个分量是a的第3个分量乘以b的第3个分量
......
下面解释为啥要乘以cosθ
一个物体或一个像素的颜色值是rgb(0.6, 0.667, 0.334)
这个0.6、0.667、0.334的反射率是相对于垂直入射的光线而言
如果斜着入射,光线能量会有耗损,想想夏天与冬天,都是因为太阳直射和斜射导致的
再来看这张图
光线方向就是一个实打实的空间向量
刚才的颜色,虽然也是vec4,但是我们不把它看作空间向量来分析
光线向量可以等价分解为:
水平的一个向量和垂直表面的一个向量
水平的那个向量对应的光线,根本照射不到物体,所以不会激发物体对光的吸收与反射这个物理反应。那么就只考虑垂直物体表面的光线分量。
这下就理解了公式的下述部分:
<入射光颜色>×cosθ