OpenGL中的光照系列之一[基本理论]

OpenGL 光照 只是针对Phong模型的镜面光计算方案进行优化,主要是因为Phong模型镜面光效果是取决于光线反射向量和观察向量的夹角的cos值 max(0, dot(viewDir, reflectDir)),所以这个方案就存在当夹角 >= 90 的时候我们得到得镜面光效果都 等于0 导致会存在镜面光一个明显的断层效果,如下图右图就是观察方向和反射方向夹角 > 90 的情况了。所以可以理解为正常情况下(全局白色光照,全局的含义是光是四面八方全方位的光照)物体颜色就是物体的对颜色的反射系数。由于物体的反射系数是不变的。 阅读详情
  • 概述

神说、要有光、就有了光   —— 圣经

OpenGL中的光照、材质和颜色总是紧密联系在一起的,光作为OpenGL中的一个基本特性,在模拟真实环境中有着不可替代的作用。本系列讨论颜色与光照的基本原理、OpenGL中光照的模拟方式、各种参数的设置以及使用等,通过这些内容,让读者对整个OpenGL的光照体系有一个完整的认识。

尽管当前OpenGL的编程从旧式的固定管线模式(glBegin、glVertex、glEnd)过渡到了当今的可编程管线模式(Shader),但是本文中描述的内容依然适用。

  • 什么是颜色

颜色只是某种波长的光,能够被肉眼看到。在高中物理中我们知道光分为很多类型,包括可见光、红外线、紫外线、X射线等,我们眼睛可以接受的只是其中某个波段的光,下图是可见光的波普范围:


当一个物体我们说它是红色时,实际上它并不是红色,它只是反射红色的光(而吸收了其他颜色的光),这样我们眼睛接受到的都是红色的光,让我们觉得它是红色的。如果我们使用绿色的光去照射它,那么我们实际上什么也看不到(因为绿色的光都被物体吸收了),许多魔术师都用这种方式来“欺骗”我们的眼睛。

  • 人眼是光子检测器

眼睛有三种类型的锥细胞,它们都会对光子做出反映,每种类型的锥细胞对特定波长的光子敏感,其中一种对红色敏感、一种对绿敏感、另一种对蓝色敏感,这些不同的锥细胞被指定波长的光子刺激到之后,大脑会接受到信号,让人眼感受到物体的颜色。

  • OpenGL对光的模拟

现实生活中的光是难以描述的,OpenGL使用了一种简单的方式实现对光的模拟,它将光分为三种成分:环境光(Ambient)、散射光(Diffuse)、和镜面光(Specular),这只是一种模拟方式,读者也可以使用自己的方式来模拟光照,这种方式的模拟称为ADS光照模型。下面我们对这些光的成分逐一分析:

  • 环境光(Ambient Light)

环境光并不是来自特定的方向,它来自某个光源,但却在房间或者场景中四处反射,没有方向可言,有环境光所照射的物体在所有方向的表面都是均匀照亮的,因此看起来像一个2D的物体,下图是某个球体仅在环境光照射下的效果:


  • 散射光(Diffuse Light)

散射光具有方向性,来自于一个特定的方向,根据入射光线的角度在表面上均匀的反射开来。被散射光照射的表面看起来更亮一些,下图是一个球体受到红色的散射光照射之后的效果(光线从左向右)


  • 镜面光(Specular Light)

镜面高光也具有方向性,它的光线来自同一个方向,与散射光不同的是,入射之后的光线会沿一个特定的方向反射。高强度的镜面光趋向于在它表面形成一个亮点,由于它的高度方向性,镜面光甚至可能看不到,下图是一个受镜面光照射的球体的效果:


  • 综合考虑

没有一种光源是纯粹由上面所述的任何一种类型的光所组成的。事实上光源是由各种强度的不同类型的光所组成的。例如实验室的红色激光束几乎是由纯的红色镜面光组成的,当它照射到物体时会产生一个非常强的亮点。但是烟或灰尘会导致激光束发散,产生非常小的环境光成分。

  • OpenGL中的材质

有前面的论述我们知道,物体的颜色如何最终确定除了和光有关系之外,还和物体的材质有关。一个物体的颜色是由它所反射的光的波长来定义的,一个蓝色的球反射了绝大部分的蓝色光子,并吸收了绝大部分的其他光子。一般来说现实世界中的绝大多数场景都是由均匀包含所有各种颜色光的白色光组成,绝大多数物体都呈现它们的“自然颜色”。总体来说就是:在开启光照计算之后,物体的颜色最终是什么需要依据光照和物体的材质共同决定。OpenGL的物体材质包括如下部分:

  • 环境颜色(AMBIENT)

材质中的环境颜色会与光中的环境颜色计算是最终决定物体颜色的因素之一,具体的作用计算可以参考后续内容

  • 散射颜色(DIFFUSE)

会与光中的对应部分计算决定物体颜色的因素之一

  • 镜面颜色(SPECULAR)

同上

  • 镜面指数(SHINESS)

也是参与最终决定物体颜色计算的一个参数

  • 发射颜色(EMISSION)

可以让物体看上去好像发光体,一般用来模拟场景中的光源效果


下文接着介绍OpenGL光照的计算

OpenGL学习笔记(九):初级光照:光照模型(环境光照、漫反射光照、镜面光照) 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,这样处理起来会更容易。 阅读详情

相关推荐

OpenGL基本概念入门4——颜色、光照和材质3

4 为图元指定法向量 OpenGL必须通过图元的法线向量来确定图元的明暗程度。只有场景中的物体有了明暗的不同,场景才有立体感。 确定一个平面的法向量是一件相当简单的事情。在一个平面上,随意寻找两个互不平行的向量,它们的外积(叉积)就是这个平面的法线。 计算两向量的外积可以使用公式: Sx = UyVz - UzVy Sy = UzVx - UxVz Sz = UxVy - UyVx 上述公式中,U、V为两不平行向量,S为U、V的外积(即U×V)。

因为了解所以无知 1万+

OpenGL 入门(八)— 标准光照模型

一个通过计算环境光,漫反射,和镜面光分量的值来估计真实光照的模型。通过给每个没有被光照的物体很小的亮度,使其不是完全黑暗的,从而对全局光照进行估计。一个顶点/片段与光线方向越接近,光照会越强。使用了法向量来计算角度。反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。一个垂直于平面的单位向量。法线矩阵(Normal Matrix): 一个3x3矩阵,或者说是没有平移的模型(或者模型-观察)矩阵。它也被以某种方式修改(逆转置),从而在应用非统一缩放时,保持法向量朝向正确的方向。

qq_40120946的博客 2549

OpenGL+超级圣经

OpenGL+超级圣经 pdf格式的 OpenGL+超级圣经 pdf格式的

OpenGL光照之基础光照

现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,这样处理起来会更容易一些,而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型(Phong Lighting Model)。冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。

一个小菜鸡的学习之路 2194

opengl光照模型

光照模型的简单应用

内部威胁论文阅读笔记(CMU-CERT专场)

在网上看了很多介绍该数据集的博客,一直有个疑问,这个数据集的标注在哪,本着先入为主的想法结合现有的资料对这个数据集的结构做了一下猜测(可能还是不严谨和正确)1.标注在哪2.什么是密集针模型3.场景文章连接内部人员由于可以绕过安全检测发起攻击,通常最有害的攻击被认为是内部人员发起。通过分析用户行为来检测内部威胁,主要分析一些类时间和活动进行特征选择。选择特征向量用于训练。采用cmu-certr4.2用于训练。提出的算法与。

Jerry的博客 2803

光照模型

Lambert模型(漫反射)环境光:Iambdiff = Kd*Ia其中Ia 表示环境光强度,Kd(0<K<1)为材质对环境光的反射系数,Iambdiff是漫反射体与环境光交互反射的光强。方向光:Ildiff = Kd * Il * Cos(θ)其中Il是点光源强度,θ是入射光方向与顶点法线的夹角,称入射角(0<=A<=90°),Ildiff是漫反射体与方向光交互反射的光强...

weixin_30709061的博客 403

从零到一:Ubuntu22.04下VSCode与中文输入法的深度整合指南

本文详细介绍了在Ubuntu22.04系统中如何深度整合VSCode与中文输入法,包括环境准备、安装方案对比、输入法配置及常见问题解决方案。通过fcitx框架优化中文输入体验,提供从基础设置到高级调试的全方位指南,帮助开发者提升在Linux环境下的开发效率。

weixin_29158047的博客 482

【WebGL光照理论】(二)材质

材质 在前一篇文章中,我介绍了冯氏光照理论,冯氏光照理论主要由三个部分组成: 环境光照 漫反射光照 镜面光照 按照冯氏光照理论,我们可以绘制出非常真实的场景,但是与现实世界相比总会差那么一点。现实中,不同的物体,它们对光产生的反应是不一样的,也就是说当光线照射在物体上,它们反射的颜色不一样,亮度也不一样,这是由物体本身的材质决定的。木头、石头、金属对同一种光线产生的反应当然是不一样的,金属反光度会强很多,石头次之,木头最弱。 一. 物体材质 所以我们需要给物体定义一个材质颜色属性。物体材质定义成如下几个

AhCola 895

共享单车需求预测问题:建模篇

机器学习训练营——机器学习爱好者的自由交流空间(qq群号:696721295) 在上一篇里,我们使用可视化的方法分析了“共享单车”的数据集,理解了特征(变量)之间的关系。我们将在本篇建立几个模型预测单车的需求量,并比较它们的预测效果。 随机森林填充法 首先,导入必需的库、训练集和检验集。 import pylab import calendar import numpy as np impor...

wong2016的博客 1万+

养龙虾经验:OpenClaw用户必看的3个“省token”救命配置

本文分享了3个优化OpenClaw使用成本的配置方案:1)启用上下文压缩功能,可选择全局或单个代理设置,支持safeguard/adaptive两种压缩模式;2)修改SOUL.md提示词,要求模型回答简洁直接;3)限制对话历史长度。方案一效果最佳,可减少长对话的token消耗,但可能影响连贯性。三种方案可单独或组合使用,需根据实际场景调整参数。文章最后邀请读者分享使用痛点,将针对高频问题撰写解决方案。

wpplvhq的专栏 1418

OpenGL初学者入门——学习指南【共 9 篇文章】

关键字:OpenGL学习笔记、计算机图形学、OpenGL初学者。

Wang_Dou_Dou_的博客 6万+

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

Yilu264的博客 1万+

OpenGL光照

OpenGL光照模型基本光照模型1.放射光2.环境光3.漫反射光4.镜面反射光光源类型1.平行光2.点光源3.聚光灯代码 基本光照模型 OpenGL中有四种光照模型 放射光(自发光) &nbsp;&nbsp;&nbsp;emissiveemissiveemissive 环境光 &nbsp; &nbsp; ambientambientambient 漫反射光 &nbsp;&nbsp;&nbsp;...

ayww的博客 7613

yolov8涨点系列之轻量化主干网络替换

yolov8涨点系列之轻量化主干网络替换,以EfficientVit为例

zhang1379的博客 2887

RTOS与Linux功能差异与应用场景全面对比

在嵌入式系统的开发中,操作系统的选择至关重要。和是两种广泛应用的操作系统,它们在功能、设计目标以及应用领域中各具优势。随着嵌入式系统的不断发展,已成为嵌入式行业的大趋势。那么,这两者到底有什么不同呢?

硬核科技 402

实验9 OpenGL光照

1.实验目的: 了解掌握OpenGL程序的光照与材质,能正确使用光源与材质函数设置所需的绘制效果。 2.实验内容: (1)下载并运行Nate Robin程序包中的lightmaterial程序,试验不同光照、材质系数。 (2)运行示范代码,了解光照与材质函数使用。 3.实验原理: 为在场景中增加光照,需要执行以下步骤。 (1)设置一个或多个光源,设定它的有关属性。 (2)选择一种光照模型。 (3)设置物体的材料属性。 具体见教材用OpenGL生成真实感图形的相关内容。 4.实验代码: #include &l

图形学与可视化 6407

Open3D 点云数学形态学滤波(Python版本)

Open3D 点云数学形态学滤波(Python版本)

dayuhaitang1的博客 1397

OpenGL光照设置

光照模型 OpenGL光照模型分为三种光:Ambient Light 环境光, Diffuse Light漫反射光, Specular Light镜面反射光. 一、创建光源 void glLightfv (GLenum light, GLenum pname, const GLfloat *params) light: OpenGL提供8个光源 GL_LIGHT0 ~ GL_LIGHT7 pname: 光源属性 GL_AMBIENT 环境光 默认 (0.0, 0...

cfz751740465的博客 6835

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OpenGL || opengl中的光照材质

openGL在处理光照时,把光照系统分为三部分:光源、材料、光照模型。 光源、材料和光照模式都有各自的属性,尽管属性种类繁多,但这些属性都只有少量的几个函数来设置。 光源的属性:glLight* 材质的属性:glMaterial* 光照模式:glLightModel* 【光源的属性】&&【 材质的属性】 GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR这三种属性是光源和材质所共有的。 如果某光源发出的光照射发哦某材质的表面,则最终的漫反射强度由两个GL_DIFFU.

magic_ll的博客 2055

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OpenGL中的光照[光照计算]

光照设置 在OpenGL中当我们需要使用光照时,我们需要做如下的设置: 开启场景中的光照计算设置场景中光源的参数开启设置好的光源 下面我们就依次进行: 开启和关闭光照计算 在OpenGL中使用glEnable和glDisable来开启和关闭光照计算: [cpp] view plain copy print? // 开启光照计算  g

JeckZ博客 1347

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OpenGL光照:光照基础

 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是以目前我们所拥有的处理能力无法模拟的。因此OpenGL的光照仅仅使用了简化的模型并基于对现实的估计来进行模拟,这样处理起来会更容易一些,而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型(Phong Lighting Model)。冯氏光照模型的主要结构由3个元素组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。  环境光照:即使在黑暗的情况下,世界上也仍然有一些

少年的博客 1769

浅析OpenGL光照

浅谈OpenGL的光照          之前从来都没有涉及光照的内容,心想只要能通过常规的方法渲染出几何体甚至是模型就可以了,然而没有光照的日子注定是苦涩的,因为仅凭几何体和模型的颜色无法达到真是渲染的效果,在实际中有各种各样的光影响着我们的视觉效果,而OpenGL能够为我们还原现实生活中的光照现象。所以,我还是下决心研究OpenGL的光照了!          为了研究固定管线渲染

开发游戏,辉煌全中国 7255

OpenGL 光照常识

1. 几个概念 环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失. 全局环境光——它们并非来自特定的光源,这些光经过了多次散射,已经无法确定其光源位于何处. 散射光——来自同一方向,照射到物体表面后,将沿各个方向均匀反射,因此,无论从哪个方向观察,表面的亮度都相同. 镜面反射光——来自特定方向,也被反

OpenGL 技术 9267
上一篇: OpenGL API 之 glPixelMap
下一篇: OpenGL中的光照系列之二[光照计算]
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值