真实的光照非常的复杂,所以有关光照的算法和论文也有不少,想要模拟出更真实的光照往往需要很强的实力,很牛的算法以及很高的数学/物理水平,与此相关的技术到现在为止也只是在发展中(包括目前比较火的“光线追踪”),当然,还是要从最简单的入手,尽可能以最低的门槛,做出个大致的样子来

一、光照模型与光源

之所以说光照比较复杂,主要是在物理和数学专业上的难度,光通常都不是来自于同一光源,而是来自散落于我们周围的很多光源,即使它们可能并不是那么显而易见,光的一个属性是,它可以向很多方向发散和反弹,又或是多次反射,所以光最后到达的地点可能并不是它所临近的直射方向;

光能够像这样反射(Reflect)到其他表面,一个物体的光照可能受到来自一个非直射的光源影响

一种基础光照模型:冯氏光照模型(Phong)的主要结构由3个元素组成

  • 环境(Ambient)光:即使在黑暗的情况下,世界上也仍然有一些光亮(月亮、一个来自远处的光),所以物体永远不会是完全黑暗的,只要你在室外
  • 漫反射(Diffuse):模拟一个发光物对物体的方向性影响(Directional Impact),它是冯氏光照模型最显著的组成部分,面向光源的一面比其他面会更亮
  • 镜面(Specular)光照:模拟有光泽物体上面出现的亮点,镜面光照的颜色相比于物体的颜色更倾向于光的颜色

几种常见光源:

  • 环境光:一种低强度的光,没有位置的概念,由光线经过周围环境表面多次反射后形成的,可以用环境光可以描述一块区域的亮度,通常是常量(对应光照模型中的环境光)
  • 太阳光:定向光源,在无穷远出发射光线,光线是平行的,强度不会随着距离衰减(一般场景中只有至多一个)
  • 点光源:在有限空间内某个点上发出的光线,光线强度会随着距离衰减(最常见光源)
  • 聚光灯(SpotLight):一种具有锥形效果的光源,该光源拥有产生光的方向和角度,有主照射方向,光线强度会随着距离,延着中心向外衰减(例如手电筒,舞台灯)

阴影(Shadow)

  • 软阴影:阴影边界柔和,渐变,没有锯齿,常见而又普通
  • 硬阴影:边界锐利,通常出现在在和物体的交替处或者是光打下来离物体比较近的地方

二、环境光照

考虑环境光的性质,实现环境光照出乎意料的简单,如下修改物体的片段着色器:我们只需要用光的颜色乘以一个很小的常量环境因子,再乘以物体的颜色就ok了,这也是最基础的算法

#version 330 core
out vec4 color;
uniform vec3 objectColor;
uniform vec3 lightColor;
in vec2 texIn;
uniform sampler2D texOutA;
void main()
{float ambientStrength = 0.1f;vec3 ambient = ambientStrength * lightColor;vec3 result = ambient * objectColor;color = vec4(result, 1.0f);
}

为了能看出效果,把背景换成黑色:

如果你觉得这过于简单,可以去尝试学习全局照明(Global Illumination)算法

三、漫反射和镜面反射

再回到初高中物理,漫反射和镜面反射的区别可以用一张图表示:

为了简化问题,我们当然不可能去尝试计算每条光线的反射角和反射结果,我们只需要知道:漫反射是一个“混沌”的过程,也就是说,无论在什么方向上观察物体,从物体反射到我们眼中的光线强度和方向(总量)都是大致相似的,我们只需要考虑光与物体之间的关系,而对于镜面反射,我们就需要考虑到我们的观察视角,换句话说:

  • 对于漫反射:我们简单考虑入射光与物体表面法向量的夹角,夹角越大则越亮
  • 对于镜面反射:我们简单考虑反射光与视线方向的夹角,夹角越大则越亮

入射光和反射光关于物体反射点法向量对称

对于实现可以参考后面的文章

参考文献:https://learnopengl.com/Lighting/Basic-Lighting

OpenGL基础18:光照基础相关推荐

  1. OpenGL开发之旅基础知识介绍

    最近由于手机项目中需要用到OpenGL ES的知识,所以这段时间正在研究OpenGL的相关知识.因为OpenGL ES是OpenGL的剪裁版本,所以我直接从OpenGL入手,然后再去看OpenGL E ...

  2. [.net 面向对象编程基础] (18) 泛型

    [.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...

  3. 计算机基础18春在线作业1,东师-计算机应用基础18春在线作业1-1.docx

    东师计算机应用基础18春在线作业1 1.A 2.A 3.C 4.D 5.B 一.单选题共25题,62.5分 1.I/O接口位于 A总线和I/O设备之间 BCPU和I/O设备之间 C主机和总线之间 DC ...

  4. 18春东师计算机应用基础,东师计算机应用基础18春在线作业31.docx

    东师计算机应用基础18春在线作业3 1.A 2.A 3.D 4.D 5.C 一.单选题共25题,62.5分 1.解释程序的功能是 A解释执行高级语言程序 B解释执行汇编语言程序 C将汇编语言程序编译成 ...

  5. 计算机应用基础18春在线作业1答案,东师计算机应用基础-18春在线作业1.docx

    东师计算机应用基础18春在线作业1 1.A 2.C 3.C 4.C 5.B 一.单选题共25题,62.5分 1.国际区位.全拼双音.五笔字型和自然码是不同种类的汉字 A外码 B内码 C字型码 D交换码 ...

  6. UnityShader9.1:光照基础实例

    前置:UnityShader9:光照基础回顾 一.漫反射光照 直接上代码: 注意其中 Tags 需要设置光照模式为 ForwardBase,它定义了该 Pass 在光照流水线中的角色,在不同的光照模式 ...

  7. UnityShader9:光照基础回顾

    一.需要提前了解的 基于经验的基础光照,相比于后面物理光照的学习,简单不少: 光照基础:https://blog.csdn.net/Jaihk662/article/details/106624451 ...

  8. docker 18.x - 基础篇-臧雪园-专题视频课程

    docker 18.x - 基础篇-62人已学习 课程介绍         课程实验环境: 系统环境:CentOS 7.5 Docker版本:18.06 Docker-Compose版本:1.22.0 ...

  9. 210学习日记(18)_ARM基础知识

    210学习日记(18) --ARM基础知识 注意: 以下大部分类容都来自网上现成的(直接拷贝过来的,然后经整理)!!!! 问1:ARM处理器工作模式有几种?各种工作模式下分别有什么特点? 答1:ARM ...

  10. 东师计算机应用基础18秋在线作业3,东师计算机应用基础18秋在线作业100分答案...

    计算机应用基础18秋在线作业1 共题,总分:100分 时间:59分59秒 答题中 分 一.单选题共25题,62.5分 1 2.5分 22. 目前计算机的应用领域可大致分为三个方面,即 A计算机辅助教学 ...

最新文章

  1. Java Web开发API Boy如何进阶?
  2. Centos6.0 64位MySQL 5.5.20 CMake 安装部署
  3. 如何防止ISE综合时信号不被优化掉
  4. mysql genlog 分析_Mysq性能分析 —— Genral log(普通日志)与 Slow log(慢速日式)...
  5. 5.2.4 OS之缓冲区管理(单缓冲-双缓冲-循环缓冲-缓冲池)
  6. 深度学习-机器学习(5.2支持向量机SVM)
  7. boost::fibers::barrier用法的测试程序
  8. 从分子层面雕刻肌肉,新数学模型预测锻炼肌肉最优方式
  9. JDK8 lambda的会话指南–术语表
  10. mysql执行计划查看_查看Mysql执行计划
  11. 高效新思路!实例分割算法!腾讯、华科出品!入选ICCV 2021!
  12. 对于python命令行参数使用,你应该这么做才专业
  13. 的称重在哪里_如何申请条形码,条形码在哪里申请办理
  14. brew 安装软件能指定文件夹吗_Mac安装homebrew安装到指定目录
  15. java性能优化权威指南_《Java性能优化权威指南》PDF 下载
  16. 终于解决了x64 win7上运行金山词霸的问题
  17. 可编辑!热门动态表情包!
  18. 解决The kernel appears to have died. It will restart automatically问题
  19. 搜狗浏览器屏蔽广告插件_搜狗浏览器屏蔽芒果TV视频广告:被判不正当竞争,赔了12万...
  20. HTML5 视频直播那些事儿+吕小鸣博客

热门文章

  1. 学了python能干啥举例-django能干什么
  2. python 菜鸟-Python3 列表
  3. 用于语音情绪识别的基于对抗学习的说话人无关的表示
  4. 百度Android在线语音识别SDK用法
  5. 数值分析共轭梯度法matlab程序,数值分析11(共轭梯度法).ppt
  6. SpringBoot 实现登录验证码(附集成SpringSecurity)
  7. 【链表】牛客网:链表内指定区间反转
  8. 【动态规划】线性dp P1043 数字游戏
  9. 蓝桥杯笔记:(给的元素不重复)求全排列(排列不可重复,排列可重复)
  10. acegis连接使用方法_铝型材配件间隔连接块的分类与使用方法