您当前的位置: 首页 >  ar

Jave.Lin

暂无认证

  • 3浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

LearnGL - 13.1 - SpotLight - 聚光灯

Jave.Lin 发布时间:2020-07-29 22:04:05 ,浏览量:3

文章目录
  • 演示
  • 完整 Shader
  • Spot Light Gizmos - 聚光灯的 Gizmos 绘制
    • C++ 生成网格代码
LearnGL - 学习笔记目录

前一篇:

  • LearnGL - 13 - PointLight - 点光源 实现了 点光源 的最简单的着色方式

这篇:我们尝试给 “聚光灯” 类型的光源

本人才疏学浅,如有什么错误,望不吝指出。

其实 聚光灯 与 点光源 很类似,以为区别比较大的是: 聚光灯 有光照的张角范围,而不像 点光源 的张角是全方位的范围。

所以相比上一篇来说,代码的添加与调整也是很少的:

void phong_illumination(
    in vec3 worldNormal,
    in vec3 viewDir,
    in vec3 worldPos,
    out vec3 diffuse,
    out vec3 specular,
	out float atten
    ) {

	vec3 lightDir;
	atten = 1;
    if (LightPos.w == 0) {
		// 下面使用的是Phong 光照模型
		// 如果是方向光,那么 LightPos.xyz 是灯光方向的反方向
		lightDir = LightPos.xyz;
	} else {
		// 点光源 或是 聚光灯 都需要处理的
		lightDir = LightPos.xyz - worldPos; // 片段到光源的方向,简称:灯光方向
		float dist = length(lightDir);		// 片段到光源的距离
		lightDir *= dist == 0 ? 1 : 1.0 / dist; // 归一化
		atten = getDistanceAtten(dist);		// 获取距离衰减

		// 聚光灯
		if (LightPos.w != 1) {
			float LdotSD = dot(-lightDir, SpotLightDir); // LightDir dot Spot Light Dir
			float angle = acos(LdotSD);
			if (angle  0) S = pow(max(0, dot(H, worldNormal)), Glossy);
	specular = LightColor.rgb * LightColor.a * S * SpecularK * atten;
}

主要看:

		// 聚光灯
		if (LightPos.w != 1) {
			float LdotSD = dot(-lightDir, SpotLightDir); // LightDir dot Spot Light Dir
			float angle = acos(LdotSD);
			if (angle             
关注
打赏
1664331872
查看更多评论
0.1191s