opengl聚光手电筒效果

  • 有一个光源方向,和顶点与光源方向夹角

  • 切光角:当平面上点和光源方向的角度的cos大于cos切光角,就把聚光的效果叠加上去在这里插入图片描述

  • 着色器代码的修改:1.定义手电筒光源的属性2.传参数以及修改算法3.着色修改

  • main函数修改:添加front相机(手电筒光源)参数位置

uniform vec3 front;

//手电筒光源
struct SpotLight{
	vec3 position;
	vec3 direction;
	float cutOff;	//角度,自己定义的切光角
};
	spotLight.position = viewPos;
	spotLight.direction = front;
	spotLight.cutOff = 12.5;
	float theta = dot(normalize(vec3(spotLight.position) - FragPos),-spotLight.direction);	//注意这里向量方向
	float spotI = 0;	//着色点对于手电筒的亮度
	if(theta>cos(radians(spotLight.cutOff)))
	{
		spotI = 0.8;
	}
	FragColor = vec4((light.ambient*material.ambient
		+diffuse*light.diffuse*material.diffuse
		+specular*light.specular*material.specular)*lightColor*(attenuation+spotI), 1.0);
  • 处理平滑的范围:再设定一个角度,光圈里边是1之后都是递减的
    在这里插入图片描述
  • 着色器代码:添加了新的变量outerCutOff来规定外圈,并且这里使用了clamp函数来限定范围就不需要做if判断了
//手电筒光源
struct SpotLight{
	vec3 position;
	vec3 direction;
	float cutOff;	//角度,自己定义的切光角
	float outerCutOff;	//外圈处理平滑过渡
};
	spotLight.position = viewPos;
	spotLight.direction = front;
	spotLight.cutOff = 12.5;
	spotLight.outerCutOff = 17.5;
	float theta = dot(normalize(vec3(spotLight.position) - FragPos),-spotLight.direction);	//注意这里向量方向
	float spotI = 0;	//着色点对于手电筒的亮度
	//这里使用了clamp函数来限定范围就不需要做if判断了
	float epsilon = cos(radians(spotLight.cutOff)) - cos(radians(spotLight.outerCutOff));
	spotI = clamp((theta-cos(radians(spotLight.outerCutOff)))/epsilon,0.0,1.0);//约束到0-1之间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值