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之间
zixingcai: 帮大忙了!
Unlickys: 你好,请问是否会代码实现部分呢?
Utotao: 想请教下,这个用的是NV的GPU跑的么?
傻瓜到我碗里来: 代码有无,请指路
weixin_47279489: 将两个不同的color加在一起就好了