Learn OpenGL 笔记6.1 Advanced Lighting(高级照明)

2023-10-10 19:50

本文主要是介绍Learn OpenGL 笔记6.1 Advanced Lighting(高级照明),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前我们简要介绍了 Phong 照明模型,为我们的场景带来了基本的真实感。但有一些细节,我们将在本章中重点关注。

基础知识:

1.Blinn-Phong

以前模型的弊端:

Phong 照明是一种很好且非常有效的照明近似方法,但它的镜面反射在某些条件下会分解,特别是当光泽度低导致大(粗糙)镜面区域时。 下图显示了当我们在平面纹理平面上使用 1.0 的镜面反射光泽指数时会发生:

发生这种情况的原因是视图和反射向量之间的角度没有超过 90 度。 如果角度大于 90 度,则生成的点积变为负值,这导致镜面反射指数为 0.0。

    //镜面高光 = 强度 * 镜面高光参数 * 光的颜色vec3 specular = specularStrength * spec * lightColor;  

而其中的spec又等于:viewDir和reflectDir的点积 = |a||b|cos0,所以当图中的光射向里的一面,反射出的光,反射向量,与我们的眼睛向量view的夹角,就大于了90度了。导致cos0 < 0了,没光强了。

    // specularfloat specularStrength = 0.5;vec3 viewDir = normalize(viewPos - FragPos);vec3 reflectDir = reflect(-lightDir, norm);  float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);

Blinn-Phong 着色模型的优势:

1977 年,James F. Blinn 引入了 Blinn-Phong 着色模型,作为我们迄今为止使用的 Phong 着色的扩展。 Blinn-Phong 模型在很大程度上相似,但与镜面反射模型略有不同,因此克服了我们的问题。 我们不依赖于反射向量,而是使用所谓的halfway vector中间向量,它是一个单位向量,正好位于视图方向和光方向的中间。 这个中间向量与表面的法向量对齐得越近,镜面反射的贡献就越高。

 

 

当视图方向与(现在是假想的)反射向量完美对齐时,中间向量与法线向量完美对齐。 视线方向越接近原始反射方向,镜面高光越强。

无论观察者从哪个方向看,中间向量和表面法线之间的角度都不会超过 90 度(当然,除非光线远低于表面)。 结果与 Phong 反射略有不同,但通常在视觉上更合理,尤其是在镜面反射指数较低的情况下。 Blinn-Phong 着色模型也是早期 OpenGL 固定函数管道中使用的精确着色模型。

获得中间向量很容易,我们将光的方向向量和视图向量相加,并对结果进行归一化: 

L:光的向量    V:视图向量(眼睛向量)

 

 Blinn-Phong 的GLSL代码:

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

然后镜面反射项的实际计算变成了表面法线中间向量之间的点积,以获得它们之间的余弦角,我们再次提炼出一个specular shininess exponent镜面反射光泽指数

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

 

Phong 和 Blinn-Phong 着色之间的另一个细微差别是中间向量和表面法线之间的角度(blinn-phong)通常小于视图和反射向量之间的角度(phong)。 因此,要获得类似于 Phong 着色的视觉效果,必须将镜面反射光泽指数设置得更高一些。 一般的经验法则是将其设置在 Phong 光泽指数的 2 到 4 倍之间。

下面是 Phong 指数设置为 8.0 和 Blinn-Phong 分量设置为 32.0 的两种镜面反射模型之间的比较:

 

 二者切换:

void main()
{[...]float spec = 0.0;if(blinn){vec3 halfwayDir = normalize(lightDir + viewDir);  spec = pow(max(dot(normal, halfwayDir), 0.0), 16.0);}else{vec3 reflectDir = reflect(-lightDir, normal);spec = pow(max(dot(viewDir, reflectDir), 0.0), 8.0);}

这篇关于Learn OpenGL 笔记6.1 Advanced Lighting(高级照明)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/182703

相关文章

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学