材质颜色(material color)
环境光照(ambient lighting)
漫反射光照(diffuse lighting)
镜面光照(specular lighting)通过每个分量指定一个颜色
再加上反光度(shiniess)
材质
片段着色器中,结构体储存物体材质,可以把它们储存为独立的uniform,定义结构体的布局(layout),使用刚创建的结构体为类型,简单声明一个uniform变量。
ambient材质向量定义了在环境光照下物体反射颜色,通常和物体颜色相同。diffuse材质向量定义了漫反射光照下物体颜色。specular材质设置的镜面光照。
shiniess镜面高光散射半径。
光照贴图
一个物体可能不会只要一种材质,漫反射贴图,镜面光贴图,对物体的漫反射分量和镜面光分量有着更精确的控制,
漫反射贴图
其实就是和纹理差不多,只不过在光照场景名字叫做,漫反射贴图,表现物体所有漫反射颜色纹理图像。
sampler2D是不透明类型,只能够通过uniform定义。
投光物
光投射到物体的光源叫做投光物(lighter caster),
平行光
光源处于无限远,称为 定向光(directional light),所有光线相同方向,和光源位置无关。
所有光线平行,物体和光源相对位置不重要。
定义一个光线方向向量模拟定向光。首先对light.direction向量取反。我们目前使用的光照计算需求一个从片段至光源的光线方向,但人们更习惯定义定向光为一个从光源出发的全局方向。所以要对全局光照方向向量取反改变方向,现在是一个指向光源的方向向量了。为了展示定向光对多个物体有相同的影响,再次使用坐标系统。
点光源
朝着所有方向发光,光线随距离衰减(attenuation)。
随着距离减少光强度,
计算衰减值。
d是片段距光源的距离,
设置参数值的时候考虑因素:
环境、希望光覆盖的距离、光的类型;一般是经验值
聚光
位于环境中的某个位置,只朝一个特定的方向而不是所有的方向照射光线,相当于路灯,手电筒,
表示因素:世界空间位置、一个方向、一个切光角;切光角制定了聚光的半径。
平滑、软化边缘
为了创建一种边缘平滑的聚光,需要模拟聚光有一个内圆锥和一个外圆锥。
让光从内圆锥逐渐减暗直到外圆锥边界。
多光源
不同光源封装到GLSL函数,每一种光源计算方法不同,
在场景中使用多个光源:一个单独的颜色向量代表片段输出颜色。对每一个光源,对片段的贡献颜色将会加到片段的输出颜色向量上。场景中每个光源都会计算对各自片段的影响。
void main()
{
// 属性
vec3 norm = normalize(Normal);
vec3 viewDir = normalize(viewPos - FragPos);
// 第一阶段:定向光照
vec3 result = CalcDirLight(dirLight, norm, viewDir);
// 第二阶段:点光源
for(int i = 0; i < NR_POINT_LIGHTS; i++)
result += CalcPointLight(pointLights[i], norm, FragPos, viewDir);
// 第三阶段:聚光
//result += CalcSpotLight(spotLight, norm, FragPos, viewDir);
FragColor = vec4(result, 1.0);
}
GLSL uniform数组(GLSL Uniform Array):一个uniform值数组。它的工作原理和C语言数组大致一样,只是不能动态分配内存。