OpenGL学习笔记(五)-投光物-多光源

参考网址:LearnOpenGL 中文版
哔哩哔哩教程

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值