OpenGL ES 学习教程(七) 亮瞎狗眼的 Specular Lighting 镜面高光

2023-11-05 16:59

本文主要是介绍OpenGL ES 学习教程(七) 亮瞎狗眼的 Specular Lighting 镜面高光,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来来来,拿起手机,站到镜子前面,对着镜子打开手机闪光灯,朝镜子看,是不是亮瞎狗眼啊!

又比如下面的房子,被太阳照的反光太厉害,就像镜子一样。

还有玩家口中的的 油腻的Unreal Engine ,各种YY的油腻的师姐。


上面举了这么多例子,就是引入这一节要讲的 Speculer Lighting 镜面高光  。

一张图来解释下镜面高光


左侧是灯泡,灯泡发出光,到达顶点片段,然后被反射出来为 R 。

我们站在右侧观察,如果眼睛正好位于 光 的反射 的方向,即 眼睛位于 R 方向上,那么这个时候我们看到的光肯定是最强的。

随着眼睛 和 反射光 R 的夹角越大,那我们观察到Speculer Lighting 镜面光强度越小。


和上一篇了解到的 Diffuse Lighting 漫反射光照 对比,Speculer Lighting 镜面高光需要添加一个新的变量 - 观察者的位置。

我们代码中观察者 就是 摄像机,所以就使用 摄像机 的位置坐标 替代 观察者的位置。


所以我们添加另一个 uniform 变量添加到 Fragment Shader 片段着色器中,然后把摄像机位置传过去。(GLProgram_Cube.h Line 82)

"uniform vec3 m_camerapos;"//观察者位置

然后计算 顶点片段 指向 观察者的向量(GLProgram_Cube.h Line 96)

"vec3 cameraDir=normalize(m_camerapos-out_fragpos);" //计算顶点片段指向观察者的向量

然后计算光的反射 向量 R (GLProgram_Cube.h Line 97)

"vec3 reflectDir=reflect(-lightdir,normal);" //计算光的反射 R reflect第一个参数是光源指向片段的向量,所以这里使用 -lightdir

然后通过 cameraDir 和 reflectDir 的点积,计算出来的数值,再去 进行 pow 运算,求出 镜面亮度 (GLProgram_Cube.h Line 98)

"float spec=pow(max(dot(cameraDir,reflectDir),0.0),256.0);" //计算镜面亮度,32是高光的发光值 Shininess,发光值越高,反射光越强,散射越小,高光点越集中。

然后指定一个镜面光 强度 (GLProgram_Cube.h Line 95)

"float specularStrength=0.5;" //镜面光 中等强度 Specular Intensity

然后 相乘得到镜面光 (GLProgram_Cube.h Line 102)

"vec3 specular=specularStrength * spec * m_lightcolor;"

最后用 Specular Lighting + Diffuse Lighting + Ambient Lighting 乘以顶点颜色,得到最终颜色 (GLProgram_Cube.h Line 102)

"vec3 result=(ambient+diffuse+specular) * m_color;" //(环境光+漫反射光) * 物体本身的颜色 

然后从代码中传入 观察者的位置 ( GLProgram_Cube.h Line 93)

//传入摄像机位置;
glUniform3f(m_programCube.m_camerapos, -2, 0, 10);

运行结果如下图

可以看到中间的高亮区域

在Fragment Shader中 计算镜面亮度的时候,进行了 pow 操作,操作数是指定的一个数,这个数叫 高光的发光值 Shininess 。

下图是不同的Shininess 值产生的效果,可以看到 高光的发光值 Shininess,发光值越高,反射光越强,散射越小,高光点越集中。


示例工程下载:

http://pan.baidu.com/s/1dDSdo3J


这篇关于OpenGL ES 学习教程(七) 亮瞎狗眼的 Specular Lighting 镜面高光的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

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

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

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识