《OGL dev》Etay Meiri Tutorial 17 - Ambient Lighting 笔记
基本光照模型被称为“Ambient/Diffuse/Specular(环境光/漫反射/高光)”。
Ambient light被建模作为没有来源,没有方向,对场景中的所有物体有相同的效果的光。
Diffuse lighting强调光照射物体表面的角度会影响被照亮的物体的亮度。Diffuse lighting最重要的属性是方向。
Specular lighting是物体的属性,当光以特定的角度照射物体,并且观察者位于特定的位置时,特体的一部分变得耀眼。金属通常有Specular属性。计算Specular lighting必须同时考虑光照(和反射)的方向,和观察者的位置。
在3D应用中,通常通过光源来使用光照模型。光源是ambient、diffuse和specular强度和属性的组合。
directional light(平行光)是有方向,没有原点的光源。光线互相平行,无论物体多远光照强度相同。
太阳光有ambient和diffuse属性。太阳适合directional light。
纹理采样得到的颜色,三个通道,每一个通道1 byte,因此取值区间为[0, 255]。
所有通道为0为黑色。
相同比例缩放所有通道,基本色不变,取决于缩放因子更亮或更暗。
反射依据自身表面的颜色,反射入射光的一部分,当入射光为白光,反射光会表面的颜色,明暗取决于光照强度。
将光源颜色指定为区间[0, 1]内的浮点数,ambient强度同样指定为区间[0, 1]内的浮点数,则ambient light的计算公式如下图:
ambient light看起来有些人为,不真实,但它能解决物体的一侧被照亮,另一侧全黑的问题。
global illumination(全局照明)是更高级的技术,它考虑了从物体反射的光和照射其他物体的光,可以完全替代ambient light。
编译好的shader链接到shader程序之后,就可以通过glDeleteShader()删除它,回收这部分内存。
struct DirectionalLight
{
vec3 Color;
float AmbientIntensity;
};
uniform DirectionalLight gDirectionalLight;
m_dirLightColorLocation = GetUniformLocation("gDirectionalLight.Color");
m_dirLightAmbientIntensityLocation = GetUniformLocation("gDirectionalLight.AmbientIntensity");
shader中struct的用法与C/C++类似,应用需要为shader中struct的每一个字段传递值。