图形学光照

2023-11-11

一、概述

现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,“看起来像”就好了。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型 (Phong reflection model or Phong reflection model),冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子:
在这里插入图片描述

二、环境光照

环境光照(Ambient Lighting)即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。
把环境光照添加到场景里非常简单。我们用光的颜色乘以一个很小的常量环境因子,再乘以物体的颜色,然后将最终结果作为片段的颜色。下面是环境光计算公式
在这里插入图片描述

三、漫反射光照

漫反射光照(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact),其特点为把入射光向各个方向反射,理想的漫反射向各个方向反射的光线强度都相等(这里不考虑物体对光的折射和吸收),因此无论观察者在什么位置,看到的反射光线都是一样的。物体的某一部分越是正对着光源,它就会越亮,即当 L 与 N 越接近时越亮。(参照 Lambertian reflectance)
Phong 和 Blinn-Phong 反射模型
Phong 与 Blinn-Phong 模型漫反射光照公式
在这里插入图片描述

参数说明:
L L L:表面上的点指向光源向量
N N N:法线
R R R:光反射方向
r r r:点到光源的距离
V V V:点指向观察者方向
H H H:半程向量(Halfway Vector 有部分教程称为半角向量), V V V L L L 的平分向量,由平行四边形法则可得 H = ( V + L ) / ∣ ∣ V + L ∣ ∣ H = (V + L) / || V + L || H=(V+L)/V+L
I I I:入射光的强度
k d k_d kd:漫反射系数

注:这里所有向量都是单位向量,如有多个光源则依次累加即可

  • 光强的衰减计算
    假设有一点光源向四面八方发射光线(球形辐射,计算时使用球表面积 S = 4 π r 2 S=4πr^2 S=4πr2),在距离光源中心位置 1单位处强度为 I I I ,根据能量守恒可得
    在这里插入图片描述
    在这里插入图片描述
光强衰减示意图
  • 关于max(0, N·L)
    当 N 与 L 夹角大于 90 °,即光线无法从物体背面穿过,我们认为入射光对漫反射没有贡献。下图为相同能量照射在不同角度的平面,单位面积平面所获得能量示意图。正如太阳照射在地球各个区域的能量相同,热带地区接近太阳直射的地方获取的能量高,气温高。两极地区太阳光与地面法线夹角大,单位面积获得的能量少,气温也低。
    在这里插入图片描述

四、镜面光照

镜面光照(Specular Lighting):模拟有光泽物体上面出现的亮点。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。镜面光照是依据光的方向向量和物体的法向量来决定的,但是它也依赖于观察方向。当观察方向越接近反射方向 R R R,受到高光的影响越大。
Phong 高光示意图

高光反射的强度与 V V V R R R 的夹角 cos ⁡ \cos cos 值正相关,当夹角越大衰减越明显,但余弦函数的衰减不够理想,比如在 45° 时,现实中几乎看不到高光, cos ⁡ 45 ° \cos 45° cos45° 的值仍然很大。为修正这一误差,我们使用 cos ⁡ α \cos \alpha cosα 多次幂解决这个问题,下图为不同指数下的衰减对比。
在这里插入图片描述

综上可得 Phong 模型 高光公式为
在这里插入图片描述

  • Blinn-Phong 光照模型的改进
    Blinn-Phong 模型是对 Phong 模型的改进,因此也称 改进的 Phong 模型
    在Phong 模型中必须不断重新计算点积 R ⋅ V R\cdot V RV,并且需要先求出反射方向 R R R,在已知入射光 L L L 和 法线 N N N 的情况下要求 R R R 相对麻烦。如果引进半程向量H( H = ( V + L ) / ∣ ∣ V + L ∣ ∣ H = (V + L) / || V + L || H=(V+L)/V+L),利用平行四边形法则可直接求出 H H H。当 R R R 越接近 V V V 时,同样有 N N N 越接近 H H H,且有 N N N H H H 的夹角为 V 与 R 的夹角的一半。考虑到 H H H N N N 之间的角度小于 Phong 模型中使用的 R R R V V V 之间的角度(除非从非常陡峭的角度观察表面,否则该角度可能会更大),以及因为 Phong 正在使用 ( V ⋅ R ) n (V·R)^n (VR)n 优化,为使用 Blinn-Phong 更接近 Phong 的效果,同样使用 ( N ⋅ H ) p (N·H)^p (NH)p 优化,这里 p > n p > n p>n,当 p = 4 n p = 4n p=4n 时,接近 Phong 的效果。

在这里插入图片描述

Blinn-Phong 模型 高光公式
在这里插入图片描述

五、光照公式

  • Phong 光照公式
    在这里插入图片描述

  • Blinn-Phong 光照公式
    在这里插入图片描述

六、Demo

在这里插入图片描述

源码地址:http://https://github.com/WarZhan/Graphics-Demo/tree/master/Lighting

参考链接
[1] 基础光照:https://learnopengl-cn.github.io/02%20Lighting/02%20Basic%20Lighting/
[2] Phong 光照模型:https://en.wikipedia.org/wiki/Phong_reflection_model
[3] Blinn-Phong 光照模型:https://en.wikipedia.org/wiki/Blinn%E2%80%93Phong_reflection_model
[4] Lambertian reflectance:https://en.wikipedia.org/wiki/Lambertian_reflectance
[5] Games101 Lecture 07: https://sites.cs.ucsb.edu/~lingqi/teaching/resources/GAMES101_Lecture_07.pdf
[6] Games101 Lecture 08: https://sites.cs.ucsb.edu/~lingqi/teaching/resources/GAMES101_Lecture_08.pdf

欢迎关注个人公众号,实时推送最新博文!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图形学光照 的相关文章

  • 将glm四元数转换为旋转矩阵并与opengl一起使用

    所以我将对象的方向存储在 glm fquat 中 我想用它来旋转我的模型 我怎么做 我试过这个 glPushMatrix glTranslatef position x position y position z glMultMatrixf
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • 如何用opengl制作2D地形?

    我想制作一个简单的二维地形 只有一些颠簸和高度变化 我想过只使用随机数来描述某个顶点的高度 但我不知道如何从中制作一个网格 我正在寻找一种方法来查找地形的顶点和索引缓冲区 我该怎么做呢 您可以仅将 GL POLYGON 与所有顶点的列表一起
  • 在 OpenGL 中,为什么 glVertexAttribPointer 要求“指针”参数以 void* 形式传入?

    规格为glVertexAttribPointer如下 void glVertexAttribPointer GLuint index GLint size GLenum type GLboolean normalized GLsizei s
  • QOpenGLFunctions 缺少重要的 OpenGL 函数

    QOpenGLFunctions 似乎缺少重要的函数 例如 glInvalidateFramebuffer 和 glMapBuffer 据我了解 QOpenGLFunctions 加载桌面 OpenGL 函数和 ES 函数的交集 如果是这样
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • glEnableVertexAttribArray 中“index”参数的含义以及(可能)OS X OpenGL 实现中的错误

    1 我是否正确理解 要使用顶点数组或VBO进行绘制 我需要所有属性在着色器程序链接之前调用glBindAttribLocation 或者在着色器程序成功链接后调用glGetAttribLocation 然后使用glVertexAttribP
  • WebKit 是否使用 OpenGL 来渲染 CSS 过渡?

    WebKit 是使用 OpenGL 来渲染 CSS 过渡 还是使用软件渲染 WebKit 只是一个前端 这取决于后端和硬件支持 谷歌浏览器使用skia http code google com p skia 作为后端 它可以使用软件或硬件
  • 使用 GLSL 着色器在同一片段着色器中定义的多个子例程类型无法正常工作

    我正在开发一个使用 GLSL 着色器的程序 我编写了 2 种不同的方法来用 2 种不同的方法计算 ADS 环境光 漫反射 镜面反射 着色 为了正确完成这项工作 我使用子例程来使用一种或另一种方法来计算 ADS 着色 这是片段着色器代码的一部
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • NV_path_rendering替代方案[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚观看了 Siggraph 2012 的一个非常令人印象深刻的演示 http nvidia fullviewmedia com sig
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当 OpenGL 中同时绑定 1D 和 2D 纹理时,正确的行为是什么?

    假设你有这样的东西 glBindTexture GL TEXTURE 2D my2dTex glBindTexture GL TEXTURE 1D my1dTex glBegin 正确的 OpenGL 行为是什么 要绘制一维纹理 二维纹理还
  • 在 GLUT 中使用鼠标滚轮

    我想在 OpenGL GLUT 程序中使用鼠标滚轮来放大和缩小场景 我怎么做 Freeglut 的 glutMouseWheelFunc 回调与版本相关 并且在 X 中不可靠 使用标准鼠标功能并测试按钮 3 和 4 OpenGlut 对 g
  • 为什么拥有单独的投影矩阵但结合模型和视图矩阵会有好处?

    当您学习 3D 编程时 您会被告知用 3 个变换矩阵来思考是最简单的 模型矩阵 该矩阵对于每个模型都是独立的 它根据需要旋转和缩放对象 最后将其移动到 3D 世界中的最终位置 模型矩阵将模型坐标转换为世界坐标 视图矩阵 对于大量对象 如果不
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 在 Linux 上运行我自己的程序的权限被拒绝? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有Ubuntu 9 4 我已经构建了程序 一些基本的 OpenGL 该程序只是制作一个旋转的正方形 然后运行它并 sh blabla p
  • 如何仅剪切剪切平面的交集(而不是并集)?

    在 OpenGL JOGL 中 当使用多个剪切平面时 似乎会应用所有剪切平面的并集 我想要的是路口要应用的所有剪裁平面 这可能吗 请参阅下面的简化二维示例 Edit An example of clipping by vertex shad
  • 用于新 Windows 游戏项目的 OpenGL 或 Direct3D?或者是其他东西?

    我正在 Windows 上启动一个爱好游戏项目 该项目将大量使用 3D 图形效果 它很可能是用 C 编写的 我应该使用 OpenGL 还是 Direct3D 作为我的图形后端 为什么 或者我应该使用现成的图形引擎 例如OGRE 3D htt

随机推荐

  • google浏览器chrome安装插件方法

    该方法适合安装到一台没有联网的机器上使用 1 在可联网的浏览器 可以用极速浏览器 上 打开扩展程序 搜到要安装的插件并安装 2 地址栏输入 chrome version 查看个人资料路径 该目录下的Extensions就是插件安装位置 3
  • 3D 重构的一些应用场景

    3D 重构是利用2D 照片合成3D 图像 3D重构也是人工智能领域的一个分支 因为业界有很多应用 所以记下来 供大家参考 第一次遇到3D重构的课题是老东家在物流领域的业务场景 后来发现 3D重构的应用场景还真不少 3D重构一个重要指标是精准
  • 移植lwIP至U-Boot

    原文地址 http www wl chuang com blog 2011 11 04 porting lwip to uboot U Boot是嵌入式系統上被廣為運用的boot loader 它擁有極為活躍的開發社群 也支援許多不同類型的
  • hadoop在windows上的环境配置及HDFS API编程示范

    1 将Hadoop压缩包解压放在指定目录 2 Hadoop本地环境配置 新建一个HADOOP HOME 添加path 3 安装maven 解决java开发依赖问题 这里可以直接去官网上下载 https maven apache org
  • C#基础知识篇:C#网络编程(Socket)使用poll函数判断连接断开问题

    C Socket使用poll函数判断连接断开问题 最近在学习c 的网络编程内容 遇到这样一个问题 在服务器端 如何判断客户端的一个连接是否断开 查找相关资料 得出较好的解决方案是使用socket对象的poll函数 poll函数分析 下面是p
  • 力扣2414:最长的字母序连续子字符串的长度

    311周赛第二题 原题链接 2414 最长的字母序连续子字符串的长度 题目 字母序连续字符串 是由字母表中连续字母组成的字符串 换句话说 字符串 abcdefghijklmnopqrstuvwxyz 的任意子字符串都是 字母序连续字符串 例
  • 计算机网络是由负责,计算机网络应用基础

    41 当进行网络互联时 如果总线网的网段已超过最大距离 可用 来增强信号 以便使信号传输更远的距离 A 中继器 B 网卡 C 网关 D 路由器 42 网络中所使用的互联设备Hub称为 A 集线器 B 路由器 C 服务器 D 网关 43 是属
  • Modelling Context and Syntactical Features for Aspect-based Sentiment论文阅读笔记(ACL2020)

    目录 原文翻译 基于方面的情感分析的上下文和句法特征建模 摘要 1 介绍 2 相关工作 3 方法提出 3 1 方面提取 3 1 1 输入表示 3 1 2 词性嵌入 3 1 3 基于依赖关系的嵌入 3 1 4 微调过程 3 2 方面情感分类
  • 算法练习——力扣随笔【LeetCode】【C++】

    文章目录 LeetCode 练习随笔 力扣上的题目和 OJ题目相比不同之处 定义问题 排序问题 统计问题 注意事项 玄学 新 get 1 单调栈 2 滑动窗口 3 auto 应用 c 11 STL 4 sort 内嵌式规则 5 实现无删遍历
  • Python爬虫 如何利用浏览器获取JSON数据,如获取淘宝天猫的评论链接?

    浏览器 Chrome 工具 右键 检查 N 步骤 1 打开淘宝 天猫 2 右键 检查 3 随便点击一个商品进入购买界面 4 点击监控工具 Network Json 5 点击 商品评论 6 下拉到评论翻页处 7 点击 监控工具Clear功能
  • 微信小程序登录获取不到头像和昵称解决办法!

    微信小程序登录获取不到头像和昵称主要原因是 小程序wx getUserProfile接口被收回 大家可以按照文档操作 PS 针对小程序wx getUserProfile接口将被收回后做出的授权调整 小程序文档中提出的调整说明 对于此次变化
  • Tree-String Problem 【CodeForces - 291E】【倍增(LCA)+哈希】

    题目链接 题意 给你N个点的树 树上的边的权值是一个自上往下的字符串 然后我们再给出一个字符串 是模式串 我们现在想知道模式串在树上的出现次数 譬如说样例 我们查找的是aba 它在1 4这条链上出现了2次 在1 5上出现1次 在2 3上出现
  • [Linux]rsync显示进度

    rsync a progress info progress2
  • PCL RANSAC拟合分割多条直线

    目录 一 概述 二 代码实现 三 结果展示 1 原始点云 2 拟合结果 3 分割结果 四 相关链接 一 概述 使用RANSAC算法拟合分割多条直线 输出每一条直线的拟合参数到控制台 并保存直线点云到本地文件夹 二 代码实现 include
  • 简单的局域网实现文件共享

    局域网 网络种类 覆盖范围一般是方圆几千米之内 其具备的安装便捷 成本节约 扩展方便等特点使其在各类办公室内运用广泛 局域网可以实现文件管理 应用软件共享 打印机共享等功能 在使用过程当中 通过维护局域网网络安全 能够有效地保护资料安全 保
  • 行为驱动测试_我如何知道自己是否正在测试行为?

    行为驱动测试 在整个 测试气味 目录中 有迹象表明您可能正在测试您的代码 而不是其行为 即使在最不起眼的单元测试中 首要规则也应该是 使您的代码执行其工作 并查看结果如何 编写代码及其测试的开发人员在为代码的每一行和每个分支进行测试时 常常
  • 2023第十四届蓝桥杯国赛 C/C++ 大学 B 组 (赛后记录)

    2023 第十四届蓝桥杯国赛 C C 大学 B
  • DDR CTRL介绍

    译文 DDR4 Initialization Training and Calibration
  • 正则表达式(一)——基础之匹配字符,数量,边界

    1 概念 1 1 正则表达式概念 正则表达式 又称正规表达式 规则表达式 正规表示法等 英语 Regular Expression 在代码中常简写为regex regexp或RE 计算机科学的一个概念 正则表达式使用单个字符串来描述 匹配一
  • 图形学光照

    图形学光照 一 概述 二 环境光照 三 漫反射光照 四 镜面光照 五 光照公式 六 Demo 一 概述 现实世界的光照是极其复杂的 而且会受到诸多因素的影响 这是我们有限的计算能力所无法模拟的 因此OpenGL的光照使用的是简化的模型 对现