图形学光照

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(使用前将#替换为@)

图形学光照 的相关文章

  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • GLSL 中统一浮点行为和常量浮点行为的不同

    我正在尝试在 GLSL 中实现模拟双精度 并且观察到一种奇怪的行为差异 导致 GLSL 中出现细微的浮点错误 考虑以下片段着色器 写入 4 浮点纹理以打印输出 layout location 0 out vec4 Output unifor
  • OpenGL中背景对象绘制在前景对象前面?

    为了测试目的 我们假设我画了 2 个茶壶glutSolidTeapot 像这样 glColor3f 1 0f 0 0f 0 0f Red teapot glutWireTeapot 1 0f glColor3f 0 0f 1 0f 0 0f
  • OpenGL:VAO 和 VBO 对于大型多边形渲染任务是否实用?

    如果您想渲染一次在视锥体中包含数千个多边形的大型景观 并且用户的视点不断变化 那么使用 VAO 或 VBO 是否实用 我的意思是 每次玩家的位置或摄像机旋转发生变化时 您都必须重新计算顶点数据 以便正确剔除不再可见的任何顶点或场景 以保持良
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • GL_COLOR_ATTACHMENT 有什么作用?

    我现在正在学习帧缓冲区 但我只是不明白颜色附件的作用 我了解帧缓冲区 第二个参数的意义是什么 glFramebufferTexture2D GL FRAMEBUFFER GL COLOR ATTACHMENT0 GL TEXTURE 2D
  • 如何在OpenGL中像这样绘制连接的带状线

    我想用以下方式绘制一系列连接线 GL LINE STRIP 我尝试过自己编写代码 但没有得到想要的结果 所以我来到这里 帮助我找出我错在哪里 这里我只给出我的draw 函数 glBegin GL LINE STRIP glVertex2f
  • 使用 gl_FragColor 与 vec4 颜色?

    似乎有很多不明确的地方gl FragColor被弃用 例如 它缺失在GLSL 4 40 规范 https www khronos org registry OpenGL specs gl GLSLangSpec 4 40 pdf 但它包含在
  • OpenGL纹理渲染与原始不匹配

    我正在尝试使用 OpenGL 渲染纹理 我用作测试的纹理是白色背景上的一堆黑色矩形 如下所示 然而 在渲染时 纹理似乎被复制并叠加在其自身之上多次 我使用以下方法设置场景 std string vertexSource ShaderLoad
  • 使用普通画布/文本输出更新LayeredWindow

    有没有一种方法可以使用画布在表单上绘图 然后使用 updatelayeredwindow 这样表单就不可见 但文本可见 就像只显示文本的半透明表单一样 如果没有 那么有没有办法只用画布 opengl directx 制作某种半透明形式 我想
  • 仅在发布模式下使用 glGenBuffer 时出现未处理的异常 - QT

    我在 Windows 7 上使用 Qt 4 8 发布模式编译项目时遇到了一些问题 调试时一切正常 但在发布时我收到未处理的异常 0xC0000005 访问冲突 我将范围缩小到发生这种情况的行 即生成像素缓冲区的时间 我的第一个猜测是 DLL
  • 之前对 GL.Color3 的调用使我的纹理使用了错误的颜色

    制作 2D OpenGL 游戏 渲染帧时 我需要首先绘制一些计算的四边形几何体 然后绘制一些纹理精灵 当我的渲染方法主体仅绘制精灵时 一切正常 但是 当我尝试在精灵之前绘制几何四边形时 精灵的纹理会更改为之前使用的最后一个 GL Color
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • 进行亚像素平移时,2D 纹理会扭曲

    我想知道一个理论推理为什么这是可能的 几何体的平移与纹理映射有何关系 我只能在进行子像素平移时注意到这种效果 如果通过整个像素平移 纹理看起来很好 我正在使用正交投影 GL CLAMP TO EDGE GL NEAREST 片段着色器是hi
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • OpenGL 缓冲区、glFlush 和 glutSwapBuffers()

    使用之间有什么区别吗 glutInitDisplayMode GLUT SINGLE GLUT RGB with glFlush and glutInitDisplayMode GLUT DOUBLE GLUT RGB with glutS
  • 开启TK onRenderFrame和onUpdateFrame的区别?

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • OpenGL 新手: glutMouseFunc

    我试图在单击鼠标后更改球体位置 但在使用 glutMouseFunc 中的 x 和 y 时它不起作用 以下是代码 include stdafx h include
  • sRGB 纹理。它是否正确?

    我最近阅读了一些有关 sRGB 格式以及它们如何允许硬件自动对典型显示器执行色彩校正的文章 作为我阅读的一部分 我发现您可以使用普通纹理和返回结果上的 pow 函数来模拟此步骤 无论如何 我想问两个问题 因为我以前从未使用过此功能 首先 有
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半

随机推荐

  • 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的光照使用的是简化的模型 对现