点光源

上一篇博客我们提到的光照模型是基于平行光的,比如太阳。当我们使用点光源的时候,比如说灯泡,光线会有一个衰减的效果。


光的强度和离点光源的位置的平方成反比,并且为了使模型更加逼真,加入了常量因子,线性因子,指数因子,使其更加符合真实的效果。

与平行光模型不同的是,平行光的入射方向由点光源和表面位置决定,就像计算人的视线和表面一样。并且考虑衰减和多个点光源的效果。

struct{float Constant;float Linear;float Exp;} Attenuation;//点光源的三个参数

我们如果想拥有多个点光源,就要设置对应的多个结构体。

vec4 CalcPointLight(int Index, vec3 Normal)//Index代表了第几个点光源
{vec3 LightDirection = WorldPos0 - gPointLights[Index].Position;//计算入射光方向float Distance = length(LightDirection);LightDirection = normalize(LightDirection);vec4 Color = CalcLightInternal(gPointLights[Index].Base, LightDirection, Normal);float Attenuation = gPointLights[Index].Atten.Constant +gPointLights[Index].Atten.Linear * Distance +gPointLights[Index].Atten.Exp * Distance * Distance;return Color / Attenuation;//光线递减的模型
}

聚光灯光源

除了平行光,如太阳,点光源,如灯泡,还有最后一种光源,成为聚光灯光源,如手电筒。

黑暗情况下,我们手电筒像黑暗处照射,我们可以看到光覆盖的空间是呈锥形的。

聚光灯光源的特点:有方向,也就是手电筒对准的方向。光线衰减,和点光源一样。角度有限,光覆盖的范围不是四面八方,而是以手电筒对准方向为中心,以一定角度的覆盖空间。这些是区别于另外两种光源的地方。

那么我们如何来模拟呢?

struct SpotLight : public PointLight
{Vector3f Direction;//光源方向float Cutoff;//角度截止范围SpotLight(){Direction = Vector3f(0.0f, 0.0f, 0.0f);Cutoff = 0.0f;}
};

在点光源的基础上,增加光源方向和截止角度。方向很好理解,不会像点光源一样照射四面八方。但是聚光灯光源除了要随距离衰减,还要随距离中心的角度衰减。我们定义Cutoff为cos值。当小于这个值时,不在聚光灯照射范围内,当大于这个值时,认为在圆锥内。当等于时,我们认为正好处于边界。我们想让中心的光最强,边界上的光刚好没有,所以根据cos值到1和cutoff的百分比,缩放到0-1内,可以模拟出聚光灯光源的效果。

vec4 CalcSpotLight(struct SpotLight l, vec3 Normal)
{vec3 LightToPixel = normalize(WorldPos0 - l.Base.Position);float SpotFactor = dot(LightToPixel, l.Direction);if (SpotFactor > l.Cutoff) {vec4 Color = CalcPointLight(l.Base, Normal);return Color * (1.0 - (1.0 - SpotFactor) * 1.0/(1.0 - l.Cutoff));}else {return vec4(0,0,0,0);}
}

opengl学习笔记(六)相关推荐

  1. openGL学习笔记六: glew库及使用

      window默认支持到OpenGL1.3,后续也没有更新,opengl并不是以API更新或者新的开发包方式更新功能,它使用了扩展方式获取高版本新的功能. 如执行扩展功能函数glArrayEleme ...

  2. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  3. 【OpenGL学习笔记】地月系

    OpenGL学习笔记2-地月系 文章目录 OpenGL学习笔记2-地月系 前言 运行结果 纹理图片 一.TexturePool 1.**TexturePool.h** 2.**TexturePool. ...

  4. 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】

    ✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...

  5. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  6. Ethernet/IP 学习笔记六

    Ethernet/IP 学习笔记六 EtherNet/IP defines two primary types of communications: explicit and implicit (Ta ...

  7. 吴恩达《机器学习》学习笔记六——过拟合与正则化

    吴恩达<机器学习>学习笔记六--过拟合与正则化 一. 过拟合问题 1.线性回归过拟合问题 2.逻辑回归过拟合问题 3.过拟合的解决 二. 正则化后的代价函数 1.正则化思想 2.实际使用的 ...

  8. ROS学习笔记六:理解ROS服务和参数

    ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...

  9. OpenGL学习笔记:矩阵变换

    文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...

  10. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

最新文章

  1. linux免安装nginx,Nginx免安装包制作工具:Nginx-portable
  2. Qt creator自定义编译运行步骤
  3. python 高阶函数之 reduce
  4. 查询CPU占用高的SQL语句的解决方案
  5. 【python】抄写大神的百度贴吧代码
  6. leetcode239. 滑动窗口最大值(思路+详解)
  7. 实用常识_实用垃圾收集,第1部分–简介
  8. 如何看待自己写的烂代码
  9. python比较时间的最大值_时间戳的最大值
  10. -bash-退出_为什么这么多开发人员在找到工作之前就退出了。 请-不要。
  11. 2022年 预训练的下一步是什么?
  12. 第 2 章 设计模式七大原则
  13. UPDATE INNER JOIN 两表联合更新
  14. Spark 概念学习系列之从spark架构中透视job(十六)
  15. RapidXML的读写
  16. Endnote快速上手
  17. 计算机毕业设计Android手机微博系统客户端app(源码+系统+mysql数据库+Lw文档)
  18. Oracle创建表,id为自增序列
  19. for循环布局多个视图
  20. Oracle表空间不足ORA-01654

热门文章

  1. 测试用例综合设计方法
  2. ERP商品管理业务逻辑封装(三十四)
  3. Centos6.8下SVN安装
  4. NPOI 导出Excel 数据方式
  5. STM32CubeMX软件工程描述_USART配置过程
  6. DotLucene源码浅读笔记(1) : Lucene.Net.Analysis 【转】
  7. JavaScript split() 方法
  8. Apache 查看连接数
  9. 二分答案——H指数(Leetcode 274)
  10. 如何在openGauss 2.1.0中使用Job?