着色及光线反射原理
着色英文名叫shading,在韦氏字典里的意思表达的是一个物体的明暗和颜色,在图形学中有特殊的含义,即:将材质应用于对象的过程。
shading有很多种方式,这里介绍其中一种比较简单的,叫Blinn-Phong 反射模型。
我们知道,人的眼睛能看到物体表面的明暗和颜色,是因为光射到了物体上,然后反射到人的眼睛里。
反射有三种方式:高光 Specular highlights、漫反射 Diffuse reflection、环境光Ambient lighting。
对于每一个单独的物体,为了衡量光线的强度 ,我们定几个参数作为输入项,根据这几个参数,可以得到最后的颜色。
着色点 shading point:我们假设物体表面有无数个点可以反射光,每个点为一个shading point
法线向量 n:沿物体表面,过shading point做一条切线,垂直于这条切线并向外的线,设为单位向量
光源方向向量 l:从shading point连向光源的线,设为单位向量
观测方向向量 v:从shading point连向摄像机的线,设为单位向量
现在把高光、漫反射、环境光分别用以上参数做分析。
漫反射
我们可以认为,漫反射是光线以一定的角度直射到物体表面,均匀的反射到各个方向。
Blinn-Phong 反射模型认为,漫反射受到3个因素叠加而成,分别是光源到物体的距离、光线跟物体的角度、物体的材质。
光源到物体的距离
我们把光线看成一种能量,一束光外扩散,总能量不变,范围便大,强度变低。光的强度跟距离的平方成反比。
我们用I/r²表示能量到达系数,I表示光强度,r表示扩散半径。
光线跟物体的角度
就像太阳的直射会造成夏季一样,光射向物体的角度会造成物体表面单位面积的光密度不同,从而接收到的光强度不同。当角度θ越接近0°强度最大,物体越亮;越接近90°强度越小,物体越暗。
我们用max(0, n · l) 表示接收系数,n和l分别是法向量和光源向量,他们的乘积等于两个向量的夹角cosθ的值(0°时为1,90°时为0)。max的作用是如果值为负并不会有衰减。
物体的材质
不同的材质表面吸收的光不同,导致人看到的颜色不同。
我们用kd表示材质漫反射系数。
从左到右不同的材质, 同样强度同样角度的光照所反射的颜色不同。
综上所述,可以用一个公式来表示漫反射的总颜色值:
高光
Blinn-Phong 反射模型认为,高光是一束很窄的光,只有反射向量和观测向量非常接近时,才能被观测到。
跟漫反射类似,我们可用光源到物体的距离、反射向量和观测向量的夹角、物体的材质三个因素叠加形成高光。(跟漫发射不同的是,Blinn-Phong 反射模型的高光不会考虑接收强度,也就是光线跟物体的角度)。
但是由于反射向量的计算量比较大(根据入射方向和法线向量求出),Blinn-Phong 提出了一种优化方法,即法线向量n和半程向量h的夹角,可以一定程度来表示R和v是否接近。
而半程向量非常好求,l + v后再做归一化即可得。
这里需要注意的是,因为最后的夹角会影响到是否能观察到高光,而用简单的cos函数会导致能被观测到的范围非常大,例如当α=45°,cos并不等于0,相当于偏移45度依然能观察到高光,显然跟现实不太符合。这里的方法是把cos函数变成cos次方函数,通过调整次方p的值调整可见范围。一般p的值为100~200,把可见范围调整到3°~5°。
由此可得到Blinn-Phong 反射模型下的高光公式:
环境光
Blinn-Phong 反射模型认为,环境光跟光源的距离、射入角度的关系不大,可以把所有所有射入的光线因素当成常量I,然后再加上物体的材质,总共2个因素。
因此,在Blinn-Phong 反射模型中,环境光的强度是一样的(常量I),意味着如果物体的材质一样,所有只有环境光反射的地方(比如背面),看起来都是平的(没有明暗分别),不管这个地方是凹还是凸。
总结:
1.高光受光照强度、入射角度(Blinn-Phong模型不考虑)、观测角度、材质系数影响;
2.漫反射受关照强度、入射角度、材质系数影响;
3.环境光受常数I和材质系数影响。
高光 Specular highlights、漫反射 Diffuse reflection、环境光Ambient lighting三种反射叠在一起,即为最终的Blinn-Phong 反射。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下