LearnOpenGL学习笔记——高级光照

零基础学习OpenGL(十)--高级光照        之前有讲过冯氏光照模型,但他在镜面反射会在一些情况下出现问题,特别是物体反光度很低时,会导致大片(粗糙的)高光区域。        可以看到,在镜面高光区域的边缘出现了一道很明显的断层。出现这个问题的原因是观察向量和反射向量间的夹角不能大于90度。如果点积的结果为负数,镜面光分量会变为0.0。        当考虑漫反射光的时候,如果法线和光源夹角大于90度,光源会处于被照表... 阅读详情

Blinn-Phong

冯氏光照不仅对真实光照有很好的近似,而且性能也很高。但是它的镜面反射会在一些情况下出现问题,特别是物体反光度很低时,会导致大片(粗糙的)高光区域。下面这张图展示了当反光度为1.0时地板会出现的效果:
在这里插入图片描述
可以看到,在镜面高光区域的边缘出现了一道很明显的断层。出现这个问题的原因是观察向量和反射向量间的夹角不能大于90度。如果点积的结果为负数,镜面光分量会变为0.0。你可能会觉得,当光线与视线夹角大于90度时你应该不会接收到任何光才对,所以这不是什么问题。
然而,这种想法仅仅只适用于漫反射分量。当考虑漫反射光的时候,如果法线和光源夹角大于90度,光源会处于被照表面的下方,这个时候光照的漫反射分量的确是为0.0。但是,在考虑镜面高光时,我们测量的角度并不是光源与法线的夹角,而是视线与反射光线向量的夹角。看一下下面这两张图:
在这里插入图片描述
现在问题就应该很明显了。左图中是我们熟悉的冯氏光照中的反射向量,其中θ角小于90度。而右图中,视线与反射方向之间的夹角明显大于90度,这种情况下镜面光分量会变为0.0。这在大多数情况下都不是什么问题,因为观察方向离反射方向都非常远。然而,当物体的反光度非常小时,它产生的镜面高光半径足以让这些相反方向的光线对亮度产生足够大的影响。在这种情况下就不能忽略它们对镜面光分量的贡献了。

1977年,James F. Blinn在冯氏着色模型上加以拓展,引入了Blinn-Phong着色模型。Blinn-Phong模型与冯氏模型非常相似,但是它对镜面光模型的处理上有一些不同,让我们能够解决之前提到的问题。Blinn-Phong模型不再依赖于反射向量,而是采用了所谓的半程向量(Halfway Vector),即光线与视线夹角一半方向上的一个单位向量。当半程向量与法线向量越接近时,镜面光分量就越大。
在这里插入图片描述
现在,不论观察者向哪个方向看,半程向量与表面法线之间的夹角都不会超过90度(除非光源在表面以下)。它产生的效果会与冯氏光照有些许不同,但是大部分情况下看起来会更自然一点,特别是低高光的区域。Blinn-Phong着色模型正是早期固定渲染管线时代时OpenGL所采用的光照模型。
获取半程向量的方法很简单,只需要将光线的方向向量和观察向量加到一起,并将结果正规化(Normalize)就可以了:

H¯=(L¯+V¯)/(||L¯+V¯||)
翻译成GLSL代码如下:

vec3 lightDir   = normalize(lightPos - FragPos);
vec3 viewDir    = normalize(viewPos - FragPos);
vec3 halfwayDir = normalize(lightDir + viewDir);

接下来,镜面光分量的实际计算只不过是对表面法线和半程向量进行一次约束点乘(Clamped Dot Product),让点乘结果不为负,从而获取它们之间夹角的余弦值,之后我们对这个值取反光度次方:

float spec = pow(max(dot(normal, halfwayDir), 0.0), shininess);
vec3 specular = lightColor * spec;

除此之外Blinn-Phong模型就没什么好说的了,Blinn-Phong与冯氏模型唯一的区别就是,Blinn-Phong测量的是法线与半程向量之间的夹角,而冯氏模型测量的是观察方向与反射向量间的夹角。
https://learnopengl-cn.github.io/05%20Advanced%20Lighting/01%20Advanced%20Lighting/

OpenGL核心技术之光照技术 笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,优快云社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。优快云视频网址:http://edu.youkuaiyun.com/lecturer/144 光照模型在各大商业引擎中都会使用,而且光照的使用直接影响着场景的渲染,所以对于游戏品质的提升非常重 阅读详情

相关推荐

Stata:手动安装ivreghdfe包的完整指南与常见问题解决

本文提供了Stata中手动安装ivreghdfe包的完整指南,包括准备工作、详细安装步骤及常见问题解决方案。ivreghdfe作为处理高维固定效应模型的强大工具,依赖ftools、reghdfe和ivreg2三个核心组件,手动安装可避免版本冲突问题。文章还分享了进阶使用技巧,如并行计算加速和保存固定效应估计值,助力用户高效完成工具变量回归分析。

weixin_29251131的博客 929

半程向量和光照

在Blinn-Phong光照模型中,半程向量与表面法线向量的接近程度决定了镜面反射的强度。当视线正好与反射向量对齐时,半程向量就会与法线完美契合,此时,镜面高光会达到最强。由于法线一般是事先计算好的,所以半程向量计算光照相对直接计算入射光线和观察角度要节约计算资源。半程向量(Halfway Vector),也被称为半角向量,是指光线与视线夹角一半方向上的一个单位向量。通过上述公式,可以将光线的方向向量和观察向量加到一起,并将结果归一化,从而得到半程向量。其中,V为视口方向向量,L为光线方向向量。

步子哥的博客 1181

H3C设备VRF配置实战:5步搞定多业务网络隔离(附排错技巧)

本文详细介绍了在H3C设备上配置VRF(虚拟路由转发)实现多业务网络隔离的实战方法。通过五步配置流程,从创建VPN-instance、绑定接口到配置独立路由表,帮助网络工程师在单台设备上构建逻辑隔离的企业级网络,并分享了高级路由配置与常见排错技巧。

gold8的专栏 937

OpenGL超级宝典笔记——累积缓冲区与其他颜色操作

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34032792的博客 337

Python爬虫实战:扒取专利数据库核心信息,我用这招搞定反爬+数据结构化(附完整可运行代码)

这套爬虫方案从「实际需求」出发,解决了专利数据库抓取的核心痛点:反爬突破、数据结构化、标题创作。核心价值不在于代码多复杂,而在于「实用」——我用这套代码半天就抓取了800+条Python爬虫相关专利,比手动效率提升了几十倍。最后想说:爬虫技术的核心是「解决问题」,而不是炫技。专利数据能帮我们快速了解行业技术趋势,尤其是程序员,从专利中扒出的核心逻辑,远比零散的博客文章更系统。希望这篇实战分享能帮到有需要的小伙伴,也欢迎在评论区交流专利爬虫的更多技巧!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2127

RK3588 hdmirx 调试(含v4l2工具,edid编辑)

RK3588 Buildroot系统中调试HDMI-RX的过程,包括抓图、修改EDID数据、编辑EDID等操作。首先,通过logcat和寄存器信息查询HDMI-RX的状态,使用v4l2-ctl工具进行测试和修改EDID。

501846585_QQAndroid_java 2684

OpenGL-光照

OpenGL 光照

weixin_45054115的博客 3260

利用NLP技术分析爬取的文本数据:Python爬虫与自然语言处理实战

网页爬虫(Web Crawler)是一种自动化脚本,通过模拟人类浏览网页的方式,定期抓取网页内容并进行分析和存储。对于大规模的数据抓取任务,爬虫技术提供了极大的便利。常见的Python爬虫库有requestsSelenium等。在本篇博客中,我们从爬取网页文本数据开始,通过清洗和预处理,最终利用自然语言处理技术(包括情感分析、文本分类等)对数据进行了深度分析。通过该过程,我们展示了如何使用Python爬虫抓取文本数据,并利用NLP技术进行分析和建模。

2201_76125261的博客 627

LearnOpenGL学习笔记—高级光照 01~02:高级光照/Gamma校正

LearnOpenGL学习笔记—高级光照 01-02:高级光照/Gamma校正1 高级光照2 Gamma校正2.1 应用gamma矫正2.1 应用1:使用OpenGL内建的sRGB帧缓冲2.2 应用2:手动操作2.2.1 注意点1:sRGB纹理2.2.2 衰减3 实践 1 高级光照 本节对应官网学习内容:高级光照 官网基本就是讲Blinn-Phong,在入门的时候自己就额外做过了 所以附上当时的笔记:LearnOpenGL学习笔记—光照02:Lighting Basis/Advanced Lighting

清清!的博客 1113

Vue2+OpenLayers动态绘制两个经纬度并计算距离(提供Gitee源码)

动态绘制两个经纬度并计算它们之间的距离。

黄团团的个人博客 366

AI agents在公司财务报表分析中的应用

在当今竞争激烈的商业环境中,公司财务报表分析对于企业的决策制定、风险评估、战略规划等方面起着至关重要的作用。传统的财务报表分析方法往往依赖于人工操作,存在效率低下、容易出错、难以处理海量数据等问题。而AI agents作为人工智能领域的重要成果,具有自动化、智能化、高效性等特点,能够为财务报表分析带来新的突破和变革。

SuperAGI2025 1609

LearnOpenGL 学习笔记 高级光照

phong 模型中的高光项在视线方向和反射方向角大于 90 度时,反射项变为 0这导致了奇怪的效果因此现在计算一个半程向量,他是光线的方向向量和观察向量加到一起,并将结果正规化(Normalize)当视线正好与(现在不需要的)反射向量对齐时,半程向量就会与法线完美契合。所以当观察者视线越接近于原本反射光线的方向时,镜面高光就会越强。现在,不论观察者向哪个方向看,半程向量与表面法线之间的夹角都不会超过90度(除非光源在表面以下)。它产生的效果会与冯氏光照有些许不同,但是大部分情况下看起来会更自然一点,特别是低

hijackedbycsdn的博客 626

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【LearnOpenGL 学习笔记】高级光照

LearnOpenGL 学习笔记 高级光照

weixin_42489848的博客 390

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LearnOpenGL学习笔记—高级光照 09:SSAO

LearnOpenGL学习笔记—高级光照 09:SSAO1 原理引入2 样本缓冲3 法向半球4 随机核心转动5 SSAO着色器6 环境遮蔽模糊7 应用环境遮蔽8 动手试试8.0 个人总结8.1 代码与效果展示8.1.0 效果展示8.1.1 几何部分8.1.2 光照处理部分8.1.3 SSAO部分8.1.4 模糊部分 本节对应官网学习内容:SSAO 结合英文原站,中文站,以及个人实践进行描述。 第1-7节为网站内容的,边搬运边梳理 第8节为个人学习总结与实践 1 原理引入 我们已经在前面的基础教程中简单介绍

清清!的博客 1734

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LearnOpenGL学习笔记—高级光照 06:HDR

LearnOpenGL学习笔记—高级光照 06:HDR1 引入2 浮点帧缓冲2.1 基础代码3 色调映射4 HDR拓展5 其他色调映射方法 本节对应官网学习内容:HDR 结合英文原站,中文站,以及个人实践进行描述。 1 引入 一般来说,当存储在帧缓冲(Framebuffer)中时,亮度和颜色的值是默认被限制在0.0到1.0之间的。 这个看起来无辜的语句,使我们一直将亮度与颜色的值设置在这个范围内,尝试着与场景契合。 这样是能够运行的,也能给出还不错的效果。 但是如果我们遇上了一个特定的区域,其中有多个亮光源

清清!的博客 949

LearnOpenGL学习笔记—高级光照 04:法线贴图

LearnOpenGL学习笔记—高级光照 04:法线贴图1 引入2 法线贴图2.1 代码3 问题4 切线空间4.1 手工计算切线和副切线4.2 切线空间法线贴图4.2.1 TBN矩阵使用一4.2.2 TBN矩阵使用二5 复杂物体6 代码 本节对应官网学习内容:法线贴图 结合英文原站,中文站,以及个人实践进行描述。 1 引入 我们场景中已经充满了多边形物体,其中每个都可能由成百上千平坦的三角形组成。 我们以向三角形上附加纹理的方式来增加额外细节,提升真实感,隐藏多边形几何体是由无数三角形组成的事实。 纹理确有

清清!的博客 1861

LearnOpenGL学习笔记—高级光照 05:视差贴图

LearnOpenGL学习笔记—高级光照 05:视差贴图1 引入1.1 偏移方法一1.2 偏移方法二2 视差贴图3 陡峭视差映射4 视差遮蔽映射5 代码 本节对应官网学习内容:视差贴图 结合英文原站,中文站,以及个人实践进行描述(这一节英文原站描述有一些不合理之处,进行了更正)。 1 引入 视差贴图(Parallax Mapping)是一种类似于法线贴图的技术,但是基于不同的原理。 就像法线贴图一样,它是一种可以显着提高纹理表面的细节并赋予其深度感的技术。 虽然也是一种错觉,但视差贴图在传达深度感方面要好得

清清!的博客 2402

LearnOpenGL学习笔记—高级光照 07:泛光

LearnOpenGL学习笔记—高级光照 07:泛光1 引入2 提取亮色3 高斯模糊3.1 高斯模糊着色器4 把两个纹理混合5 Kalogirou的观点:关于缩小图像进行高斯模糊6 注 本节对应官网学习内容:泛光 结合英文原站,中文站,以及个人实践进行描述。 1 引入 由HDR的知识我们知道,因为监视器的亮度范围是有限的,所以明亮的光源和区域经常很难向观察者表达出来。 一种区分明亮光源的方式是使它们在监视器上发出光芒,光源的光芒向四周发散。这样观察者就会产生光源或亮区的确是强光区。 注:这个问题的提出简单

清清!的博客 865

LearnOpenGL学习笔记—高级光照 08:延迟着色法

LearnOpenGL学习笔记—高级光照 08:延迟着色法1 引入2 G缓冲 本节对应官网学习内容:延迟着色法 结合英文原站,中文站,以及个人实践进行描述。 1 引入 我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading)。 它是我们渲染物体的一种非常直接的方式,在场景中我们根据所有光源照亮一个物体,之后再渲染下一个物体,以此类推。 它非常容易理解,也很容易实现,但是同时它对程序性能的影响也很大,因为对于每一个需要渲染的物体,程序都要对每

清清!的博客 913

LearnOpenGL学习笔记—高级光照 03(2):点阴影

LearnOpenGL学习笔记—高级光照 03(2):点阴影1 万向阴影贴图1.1 生成深度立方体贴图 本节对应官网学习内容:点阴影 1 万向阴影贴图 上个教程我们学到了如何使用阴影映射技术创建动态阴影。 效果不错,但它只适合定向光,因为阴影只是在单一定向光源下生成的。 所以它也叫定向阴影映射,深度(阴影)贴图生成自定向光的视角。 本节我们的焦点是在各种方向生成动态阴影。这个技术可以适用于点光源,生成所有方向上的阴影。 这个技术叫做点光阴影,过去的名字是万向阴影贴图(omnidirectional shad

清清!的博客 792

LearnOpenGL学习笔记—高级光照 03(1):阴影映射

LearnOpenGL学习笔记—高级光照 03:阴影映射、点阴影0 前言1 知识:阴影映射2 知识:深度贴图2.1 知识:光源空间的变换2.2 知识:渲染至深度贴图3 深度贴图实践 0 前言 在用几何着色器做机器人爆破中出现了一个BUG,此时才发现并修复 (不过代码已经在发现后及早做了修改,以几何着色器那节的代码为准,并且之后的章节都没有再去弄爆破效果,所以除了那节以外没有影响) 详情可点击 几何着色器 的4.1节 1 知识:阴影映射 本节对应官网学习内容:阴影映射 关于知识部分,也可以结合着看当时学gam

清清!的博客 1297

【实践LearnOpenGL项目】高级光照篇

本文详细介绍了OpenGL中三种图形渲染技术的实现方法:1. 阴影贴图技术:通过创建深度纹理和帧缓冲对象,从光源视角渲染场景,解决阴影伪影问题时采用PCF渐进过滤和动态阴影偏移。2. 点光源阴影技术:使用立方体贴图记录六个方向的深度信息,通过几何着色器实现单次多面渲染,并采用20次PCF采样实现柔和阴影效果。3. 法线贴图技术:利用TBN矩阵转换空间坐标,通过切线空间中的法线纹理增强表面细节表现。文章包含完整的代码实现和效果对比图,为图形渲染开发提供了实用参考。

qq_37378423的博客 1963

LearnOpenGL学习笔记—光照:复习与总结

LearnOpenGL学习笔记—光照:复习与总结0 前言1 词汇表2 完整项目2.1 main.cpp2.2 Camera.h2.3 Camera.cpp2.4 Shader.h2.5 Shader.cpp2.6 Material.h2.7 Material.cpp2.8 vertexSource.vert2.9 fragmentSource.frag2.10 LightSpot.h2.11 LightSpot.cpp2.12 LightDirectional.h2.13 LightDirectional.

清清!的博客 1017

【实践LearnOpenGL项目】光照基础篇

光照ADS模型

qq_37378423的博客 1834

13_LearnOpenGL 光照

在前面的教程中我们已经简要提到过该如何在OpenGL中使用颜色(Color),但是我们至今所接触到的都是很浅层的知识。本节我们将会更广泛地讨论颜色,并且还会为接下来的光照(Lighting)教程创建一个场景。现实世界中有无数种颜色,每一个物体都有它们自己的颜色。我们要做的工作是使用(有限的)数字来模拟真实世界中(无限)的颜色,因此并不是所有的现实世界中的颜色都可以用数字来表示。然而我们依然可以用数字来代表许多种颜色,并且你甚至可能根本感觉不到他们与真实颜色之间的差异。

成长需要沉淀。 1136
上一篇: LearnOpenGL学习笔记——抗锯齿
下一篇: LearnOpenGL学习笔记——Gamma校正
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值