文章目录
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
关注
打赏
热门博文
- 3D Assets (Textures & Model & Animations) & Game Design Ideas & DCC Tutorials & TA
- LearnGL - 学习笔记目录
- Unity - Timeline 知识汇总
- Unity Graphics - 知识点目录 - 停止翻译,因为发现官方有中文文档了
- Graphic资料
- Unity Lightmap&LightProbe局部动态加载(亲测2020以及以上版本官方修复了)
- Unity - 踩坑日志 - 低版本线性颜色空间渲染异常的 “BUG”
- Unity Shader - PBR 渲染 SP 导出的素材
- 什么是 3A 游戏?
- Photosohp - 实现 2D MetaBall、MetaFont