简介
在之前文章中,我们模拟了物体的独特的光照特效,但是在一个面上所有点的效果都是一样的,显然和现实情况还有差距。在现实世界中,大部分物体的表面都是有不同材质的,对光的反应也不相同。在光照场景中,通常有漫反射和镜面光贴图(Map)两种方式,来精确控制物体的漫反射分量和镜面光分量以模拟现实世界的物体。
漫反射贴图
现在我们使用纹理来代替前面的纯色实现立方体的面,然后显示光照的效果。我们使用下面这样一幅图片来作为立方体的面:
struct Material {
sampler2D diffuse;
vec3 specular;
float shininess;
};
计算结果时使用纹理的像素颜色(不包括透明度)来计算:
// 环境光照
vec3 ambient = light.ambient* texture2D(material.diffuse, TextCoord).rgb;
// 漫反射光照
// 归一化光源线
vec3 lightDir = normalize(light.position - fragPos);
float diff = max(dot(norm, lightDir), 0.1);
vec3 diffuse = diff * light.diffuse * texture2D(material.diffuse, TextCoord).rgb;
// 镜面光照
vec3 viewDir = normalize(-fra