ADS(ambient, diffuse, specular)着色计算

参考:https://learnopengl-cn.readthedocs.io/zh/latest/02 Lighting/02 Basic Lighting/
参考:http://www.opengl-tutorial.org/cn/beginners-tutorials/tutorial-8-basic-shading/

在使用ADS(ambient, diffuse, specular)三种材质参数对物体进行着色时,涉及三种材质对最终物体各部位颜色的影响:

下面这张图体现了三种属性各自的影响和叠加的效果:
(注:图片来源与参考文档)
ADS(ambient, diffuse, specular)着色计算_第1张图片

ambient环境光:

光线来自四面八方,光源通常也是有多个,物体之间也有光线的反射。环境光可以描述环境中的全局照明效果,它和入射角度没有关系。
光来源与光源,环境光也不例外,环境光相当与光源散射到物体上光的量,简单期间:环境光可以建立一个与光源系比值的系数作为参数,例如0.1
环境光的颜色 = 光源颜色 * 环境光系数
着色到物体上的环境光颜色 = 物体的基色 * 环境光颜色

diffuse漫反射光:

diffuse漫反射光对物体的着色产生显著影响,光照方向和物体表面越倾向与垂直,物体就越能获取到更大的亮度。漫反射光照的方向和物体表面的夹角对漫反射光有显著影响。
漫反射光颜色 = 光源颜色 * max(0, dot(光照方向,物体表面法向))
着色到物体上的漫反射光颜色 = 物体基色 * 漫反射光颜色

specular镜面光:

specular highlight镜面高亮,依据与光的镜面反射特点,当我们看物体时,看的方向是物体对光源反射光方向时,会有一个高光。物体对光源的反射光方向与看的方向夹角越小,看到的点镜面光亮度越高。
specular highlight表达的是镜面反射光源的颜色亮度,从而形成物体表面高光的效果。
镜面光表达镜面反射的量,作为光源能量的一部分,可以定义一个系数来表达它占能量的比值,例如0.5-中等强度。
镜面光颜色 = 光源颜色 * 镜面光系数 * pow(max(dot(反射光方向,查看方向的反向), 0), shininess128)
(pow操作,可以让参数大小对结果的变化比率增加,参数微小变化都会对结果产生较大变化,pow次数越多,光点越小,通常取32-256,shininess体现了材质的属性,不同材质的shininess不同)
着色到物体上的镜面光颜色 = 物体基色 * 镜面光颜色

颜色的复合:

把着色到物体上的ambient、diffuse、specular颜色相加就得到了物体表面的最终颜色。

物体的着色,主要考虑视觉的效果趋向于真实,需要考虑的方面应该还有距离等对光线的影响等。

(对于着色,文章中内容必然有许多不足,后续随着理解的加深逐步修正。)

个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

你可能感兴趣的:(OpenGL)