文章目录
LearnGL - 学习笔记目录
- 演示
- 完整 Shader
- Spot Light Gizmos - 聚光灯的 Gizmos 绘制
- C++ 生成网格代码
前一篇:
- 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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?