OpenGL基础18:光照基础
真实的光照非常的复杂,所以有关光照的算法和论文也有不少,想要模拟出更真实的光照往往需要很强的实力,很牛的算法以及很高的数学/物理水平,与此相关的技术到现在为止也只是在发展中(包括目前比较火的“光线追踪”),当然,还是要从最简单的入手,尽可能以最低的门槛,做出个大致的样子来
一、光照模型与光源
之所以说光照比较复杂,主要是在物理和数学专业上的难度,光通常都不是来自于同一光源,而是来自散落于我们周围的很多光源,即使它们可能并不是那么显而易见,光的一个属性是,它可以向很多方向发散和反弹,又或是多次反射,所以光最后到达的地点可能并不是它所临近的直射方向;
光能够像这样反射(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:光照基础相关推荐
- OpenGL开发之旅基础知识介绍
最近由于手机项目中需要用到OpenGL ES的知识,所以这段时间正在研究OpenGL的相关知识.因为OpenGL ES是OpenGL的剪裁版本,所以我直接从OpenGL入手,然后再去看OpenGL E ...
- [.net 面向对象编程基础] (18) 泛型
[.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...
- 计算机基础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 ...
- 18春东师计算机应用基础,东师计算机应用基础18春在线作业31.docx
东师计算机应用基础18春在线作业3 1.A 2.A 3.D 4.D 5.C 一.单选题共25题,62.5分 1.解释程序的功能是 A解释执行高级语言程序 B解释执行汇编语言程序 C将汇编语言程序编译成 ...
- 计算机应用基础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交换码 ...
- UnityShader9.1:光照基础实例
前置:UnityShader9:光照基础回顾 一.漫反射光照 直接上代码: 注意其中 Tags 需要设置光照模式为 ForwardBase,它定义了该 Pass 在光照流水线中的角色,在不同的光照模式 ...
- UnityShader9:光照基础回顾
一.需要提前了解的 基于经验的基础光照,相比于后面物理光照的学习,简单不少: 光照基础:https://blog.csdn.net/Jaihk662/article/details/106624451 ...
- docker 18.x - 基础篇-臧雪园-专题视频课程
docker 18.x - 基础篇-62人已学习 课程介绍 课程实验环境: 系统环境:CentOS 7.5 Docker版本:18.06 Docker-Compose版本:1.22.0 ...
- 210学习日记(18)_ARM基础知识
210学习日记(18) --ARM基础知识 注意: 以下大部分类容都来自网上现成的(直接拷贝过来的,然后经整理)!!!! 问1:ARM处理器工作模式有几种?各种工作模式下分别有什么特点? 答1:ARM ...
- 东师计算机应用基础18秋在线作业3,东师计算机应用基础18秋在线作业100分答案...
计算机应用基础18秋在线作业1 共题,总分:100分 时间:59分59秒 答题中 分 一.单选题共25题,62.5分 1 2.5分 22. 目前计算机的应用领域可大致分为三个方面,即 A计算机辅助教学 ...
最新文章
- Java Web开发API Boy如何进阶?
- Centos6.0 64位MySQL 5.5.20 CMake 安装部署
- 如何防止ISE综合时信号不被优化掉
- mysql genlog 分析_Mysq性能分析 —— Genral log(普通日志)与 Slow log(慢速日式)...
- 5.2.4 OS之缓冲区管理(单缓冲-双缓冲-循环缓冲-缓冲池)
- 深度学习-机器学习(5.2支持向量机SVM)
- boost::fibers::barrier用法的测试程序
- 从分子层面雕刻肌肉,新数学模型预测锻炼肌肉最优方式
- JDK8 lambda的会话指南–术语表
- mysql执行计划查看_查看Mysql执行计划
- 高效新思路!实例分割算法!腾讯、华科出品!入选ICCV 2021!
- 对于python命令行参数使用,你应该这么做才专业
- 的称重在哪里_如何申请条形码,条形码在哪里申请办理
- brew 安装软件能指定文件夹吗_Mac安装homebrew安装到指定目录
- java性能优化权威指南_《Java性能优化权威指南》PDF 下载
- 终于解决了x64 win7上运行金山词霸的问题
- 可编辑!热门动态表情包!
- 解决The kernel appears to have died. It will restart automatically问题
- 搜狗浏览器屏蔽广告插件_搜狗浏览器屏蔽芒果TV视频广告:被判不正当竞争,赔了12万...
- HTML5 视频直播那些事儿+吕小鸣博客
热门文章
- 学了python能干啥举例-django能干什么
- python 菜鸟-Python3 列表
- 用于语音情绪识别的基于对抗学习的说话人无关的表示
- 百度Android在线语音识别SDK用法
- 数值分析共轭梯度法matlab程序,数值分析11(共轭梯度法).ppt
- SpringBoot 实现登录验证码(附集成SpringSecurity)
- 【链表】牛客网:链表内指定区间反转
- 【动态规划】线性dp P1043 数字游戏
- 蓝桥杯笔记:(给的元素不重复)求全排列(排列不可重复,排列可重复)
- acegis连接使用方法_铝型材配件间隔连接块的分类与使用方法