2.5 投光物
2.5.1 平行光
1、当一个光源处于很远的地方时,来自光源的每条光线就会近似于互相平行,例如太阳。不论物体和/或者观察者的位置,看起来好像所有的光都来自于同一个方向。当假设光源处于无限远处的模型时,它就被称为定向光。
2、通过定义光线方向向量即可模拟一个定向光。
struct LightDirect {
vec3 lightDir;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
3、直接使用光的direction
向量来计算lightDir
向量。
vec3 ambient= lightDirect.ambient*texture(material.diffuse,TextCoords).rgb;
vec3 lightDir=normalize(lightDirect.lightDir);//直接获取光照方向
vec3 norm=normalize(Normal);
float diff=max(dot(norm,lightDir),0.0);
vec3 diffuse= lightDirect.diffuse*diff*texture(material.diffuse,TextCoords).rgb;
vec3 viewDir=normalize(viewPos-Frapos);
vec3 reflectDir=reflect(-lightDir,norm);
float spec=pow(max(dot(viewDir,reflectDir),0.0),material.shiness);
vec3 specular= lightDirect.specular*spec*texture(material.specular,TextCoords).rgb;
FragColor=vec4(ambient+diffuse+specular,1.0);
4、定义平行光类LightDirectional
//构造函数
LightDirectional::LightDirectional(Shader * _shader, glm::vec3 _angles, glm::vec3 _ambient, glm::vec3 _diffuse, glm::vec3 _specular):
shader(_shader),angles(_angles), ambient(_ambient),
diffuse(_diffuse), specular(_specular)
{
UpdateDirection();
}
//通过欧拉角计算光源方向
void LightDirectional::UpdateDirection()
{
direction = glm::vec3(0, 0, 1.0f);
direction = glm::rotateZ(direction, angles.z);
direction = glm::rotateY(direction, angles.y);
direction = glm::rotateX(direction, angles.x);
direction = -1.0f*direction;//方向应该为目标物指向光源,所以要取反
}
5、创建平行光对象
//创建对象
LightDirectional *myLightDirect=new LightDirectional(myShader