第八章 opengl之光照(材质)

GEE开发之ERA5(气温、降水、压力、风速等)数据获取和分析 前言:ERA5主要提供DAILY和MONTHLY两大类别数据,其中主要包括气温、降水、压力、风速等。 阅读详情

材质

想要在OpenGL中模拟多种类型的物体,我们必须针对每种表面定义不同的材质(Material)属性。
当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每个分量指定一个颜色,我们就能够对表面的颜色输出有细粒度的控制了。现在,我们再添加一个反光度(Shininess)分量,结合上述的三个颜色,我们就有了全部所需的材质属性了:

#version 330 core
struct Material {
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float shininess;
}; 

uniform Material material;

在片段着色器中,创建一个结构体来存储物体的材料属性,也可以把它们存储为独立的uniform值,但是作为一个结构体来存储更有条理。上述创建结构体后,作为类型 声明一个uniform变量。
则可以看出,为冯氏光照模型的每个分量都定义了一个颜色向量。
ambient材质向量定义了在环境光照下这个表面反射的是什么颜色,通常是和表面的颜色相同。
diffuse材质向量定义了在漫反射光照下表面的颜色,和环境光照一样,也被设置成我们期待的物体颜色。
specular材质向量设置的是表面上镜面高光的颜色,shininess影响镜面高光的散射或半径。

设置材质

在片段着色器中创建一个材质结构体的unfirom,下面修改光照的计算来遵循新的材质属性。所有材质变量都存储在一个结构体中,可以从uniform变量 material中访问:

void main()
{    
    // 环境光
    vec3 ambient = lightColor * material.ambient;

    // 漫反射 
    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(lightPos - FragPos);
    float diff = max(dot(norm, lightDir), 0.0);
    vec3 diffuse = lightColor * (diff * material.diffuse);

    // 镜面光
    vec3 viewDir = normalize(viewPos - FragPos);
    vec3 reflectDir = reflect(-lightDir, norm);  
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
    vec3 specular = lightColor * (spec * material.specular);  

    vec3 result = ambient + diffuse + specular;
    FragColor = vec4(result, 1.0);
}

现在可以通过设置uniform来设置应用中物体的材质。GLSL中的一个结构体在设置uniform时没有什么区别,结构体只是充当uniform变量的一个命名空间。所以想填充这个结构体,需要设置每个单独的uniform,以结构体名为前缀:

lightingShader.setVec3("material.ambient",  1.0f, 0.5f, 0.31f);
lightingShader.setVec3("material.diffuse",  1.0f, 0.5f, 0.31f);
lightingShader.setVec3("material.specular", 0.5f, 0.5f, 0.5f);
lightingShader.setFloat("material.shininess", 32.0f);

光的属性

可以通过一个强度值来改变光和镜面光强度。物体的环境光分量完全地影响了立方体的颜色,可是环境光分量实际上不应该对最终的颜色有这么大的影响,所以我们会将光源的环境光强度设置为一个小一点的值,从而限制环境光颜色:

vec3 ambient = vec3(0.1) * material.ambient;

可以用同样的方式影响光源的漫反射和镜面光强度。

环境光照通常被设置为一个比较低的强度,因为我们不希望环境光颜色太过主导。光源的漫反射分量通常被设置为我们希望光所具有的那个颜色,通常是一个比较明亮的白色。镜面光分量通常会保持为vec3(1.0),以最大强度发光。注意我们也将光源的位置向量加入了结构体。

struct Light {
    vec3 position;

    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};

uniform Light light;

vec3 ambient  = light.ambient * material.ambient;
vec3 diffuse  = light.diffuse * (diff * material.diffuse);
vec3 specular = light.specular * (spec * material.specular);

在应用中设置光照强度:

lightingShader.setVec3("light.ambient",  0.2f, 0.2f, 0.2f);
lightingShader.setVec3("light.diffuse",  0.5f, 0.5f, 0.5f); // 将光照调暗了一些以搭配场景
lightingShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f); 

不同的光源颜色

不同的光照颜色能够极大地影响物体的最终颜色输出。由于光照颜色能够直接影响物体能够反射的颜色,这对视觉输出有着显著的影响。
我们可以利用sin和glfwGetTime函数改变光源的环境光和漫反射颜色,从而很容易地让光源的颜色随着时间变化:

glm::vec3 lightColor;
lightColor.x = sin(glfwGetTime() * 2.0f);
lightColor.y = sin(glfwGetTime() * 0.7f);
lightColor.z = sin(glfwGetTime() * 1.3f);

glm::vec3 diffuseColor = lightColor   * glm::vec3(0.5f); // 降低影响
glm::vec3 ambientColor = diffuseColor * glm::vec3(0.2f); // 很低的影响

lightingShader.setVec3("light.ambient", ambientColor);
lightingShader.setVec3("light.diffuse", diffuseColor);
nRF52382低功耗蓝牙应用开发之入门教程-软件烧录 准备工作在上一篇文章讲过了,这里就讲讲nRFgo studio的使用 硬件准备: J-link:2线 供电:3.3V 如下图打开nRFgo studio界面介绍, 2、如果J-link正常,如下图 3、如果蓝牙芯片正常 4、烧录过程,如果蓝牙芯片之前有烧录过程序,需先点擦除,再点烧录 5、烧录代码路劲,例如 F:\nRF\SDK\nRF5_SDK_15.2.0_... 阅读详情

相关推荐

【随机过程】Markov Chain的定义及发展历程与实际应用

本模块书写的初衷:由于在学习张波张景肖等学者所著的《应用随机过程》存在着不甚了解的知识点,经过个人查找资料并整理、分享,希望能够为有同样疑惑的读者贡献绵薄之力,同时如果个人编写内容有错误,恳请读者指正。本文为对《应用随机过程》第42页中Markov Chain基本概念的补充。1.Markov Chain的定义俄国数学家 Andrey Andreyevich Markov 研究并提出一个用数学方法就能解释自然变化的一般规律模型,被命名为马尔科夫链(Markov Chain)。

qq_49657150的博客 3746

OPENGL学习笔记之十一

#OPENGL学习笔记之十一 2019/3/4 阅读材料来自[learnopengl.com][0]以及[learnopengl-cn.github.io][1] 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。 我们使用OpenGL构造的一个模型被称为冯氏光照模型(Phong Lighting Model),利于入门。冯氏光照模型的主要结构由3个分量...

Sean要加油 365

利用PV操作控制进程的并发进行---经典题解

前趋图 先理清楚前趋图中的逻辑关系:P1没有前驱,P2的前驱是P1,P3的前驱是P1、P2,P4的前驱是P2,P5的前驱是P3、P4。 前驱就是指只有在前驱进程完成后,该进程才能开始执行。由图可知,这里进程之间有6条有向弧,分别表示为P1→P2,P1→P3,P2→P3,P2→P4,P3→P5,P4→P5, 各个进程间的逻辑关系,那么我们需要设定6个信号量(S1、S2、S3、S4、S5、S6),利用PV操作来控制这些过程。 对于第一个空,P1执行完成之后,需要通知P2、P3可以开始,此处需要V(S

Yan Ka Kue的博客 6137

第七章 opengl之光照(基础光照)

第七章 opengl之光照(基础光照)

Re_view的博客 1346

宝塔部署若依前端出现502解决方法

若依系统是一个基于Java语言的开源项目,旨在帮助开发者减少开发时间,特别适用于需要快速开发出一套具有用户管理、菜单管理、权限管理、定时任务、日志管理等功能的简单系统。系统分为前后端分离、分布式等架构前后端分离部署教程然而通过宝塔来部署若依系统会遇见一些问题,特此在这里记录一下。

m0_74823683的博客 776

Synopsys PCIe IP Loopback功能深度解析与应用实践

本文深入解析了Synopsys PCIe IP的Loopback功能,包括本地数字环回和远程环回两种模式的应用实践。通过详细的寄存器配置步骤和实战案例,帮助开发者快速掌握PCIe芯片验证与调试技术,提升系统开发效率。特别适合PCIe协议相关的硬件工程师和验证工程师参考。

weixin_29198045的博客 530

OpenGL中光照的设置

1.创建、定位和启用光源(1)定义光源的颜色和位置GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };(2)创建光源 glLightfv(GL_LIGHT1, GL_AMBIENT, am

wuzoujing的专栏 1万+

保姆级教程:用CANoe手把手复现ECU刷写全流程(含BootLoader三阶段详解)

本文提供了一份详细的CANoe ECU刷写实战指南,涵盖BootLoader三阶段的深度解析。从实验环境搭建到预编程、主编程及后编程阶段,逐步讲解ECU刷写的关键步骤和隐藏逻辑,特别强调UDS诊断和CAN通信的精确控制,帮助开发者掌握ECU刷写的核心技术。

weixin_29234423的博客 531

OpenGL 入门(九)—Material(材质)和 光照贴图

从实际角度来说,木头其实也有镜面高光,尽管它的反光度(Shininess)很小(更多的光被散射),影响也比较小,但是为了教学目的,我们可以假设木头不会对镜面光有任何反应。只是在光照场景中,它通常叫做一个漫反射贴图(Diffuse Map)(3D艺术家通常都这么叫它),它是一个表现了物体所有的漫反射颜色的纹理图像。然后,我们将在片段着色器中再次需要纹理坐标,所以我们声明一个额外的输入变量。事实上,纹理与贴图原理是一样的,贴图也叫纹理贴图,其实都是使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。

qq_40120946的博客 3020

PointNetLK实战:5步搞定点云配准(附ModelNet40数据集训练技巧)

本文提供了一份详细的PointNetLK实战指南,帮助读者在5步内掌握点云配准技术。文章以ModelNet40数据集为例,深入讲解了环境搭建、数据预处理、模型训练与调试等核心步骤,并分享了关键的训练技巧和调参策略,旨在让开发者快速实现并应用这一高效的深度学习配准方法。

wind6的博客 462

为什么一个“时间片”能折腾 Linux 十年?

时间片扩展不是抢占调度器的控制权,也不是提升优先级。在“非常短暂、非常确定”的用户态临界区内,避免线程被不必要地抢占。用户态自旋锁(user-space spinlock)无系统调用的极短临界区高并发、低延迟的数据结构操作RSEQ(Restartable Sequences)保护区间一旦线程在临界区被抢占,系统整体性能反而下降。线程 A 拿着一个用户态锁线程 B 被调度上来,开始自旋等这个锁但 A 因为时间片用完,被调度器切走CPU 白白空转,所有线程都在浪费时间。

网络技术联盟站 254

LearnOpenGL笔记->入门->(基础光照-材质-光照贴图)

LearnOpenGL笔记->入门->(基础光照-材质-光照贴图),这次内容比较多,整理了好几天

2201_75303014的博客 559

Windows Docker Desktop部署MaxKB详细教程

MaxKB(Max Knowledge Base)是一款基于大语言模型(LLM)和检索增强生成(RAG)技术的开源知识库问答系统,旨在帮助企业、教育机构及研究组织高效管理知识并提供智能问答服务。

猿小白的博客 1372

第八章《OpenGL 光照与材质》

概念说明环境光模拟全局光照漫反射与法线夹角相关的亮度镜面反射与观察方向相关的高光材质属性控制物体的外观和反应光照方式光源类型定向光、点光源、聚光灯等。

yumeiguo的博客 329

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

OpenGL第八章 材质material

当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color): 环境光照(Ambient Lighting) 漫反射光照(Diffuse Lighting) 镜面光照(Specular Lighting) 反光度(Shininess) 通过为每个分量指定一个颜色,我们就能够对表面的颜色输出有细粒度的控制了。现在,我们再添加一个反光度(Shininess)分量,结合上述的三个颜色,我们就有了全部所需的材质属性了: ambient材质向量定义了在环境光照下这个表面反射的是什么颜色

ahang的博客 844

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android OpenGL(二) 学习《Android 3D 游戏开发技术宝典 -openGL ES 2.0》

note: 1 1-4章相关基础 2 5-8章重点 3 9-15章重点的进阶 4 16-19章相关技术:物理,传感器,事件交互。 5 20-22章 实例。 第一章 基础环境 第二章 游戏相关开发基础 2.1 soundpool 第三章 openGL ES 2.0 3.1 shaderUtile.loadAssetsFile("vertex.sh"); 3.2 ES 1.x

MoMing_2013的专栏 2300

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

分类的OpenGL 接口

分类的OpenGL 接口第一章使用颜色 <br />l. l glshadeModel--选择平面明暗模式或光滑明暗模式 <br />1. 2 glColor--设置当前颜色 <br />1. 3 glColorPointer--定义颜色数组 <br />1. 4 gllndex--设置当前颜色索引 <br />1. 5 gllndexPointer--定义颜色索引数组 <br />1. 6 glCOforTableEXT--为目标调色板纹理指定调色板的格式和大小 <br />1. 7 glColorsub

1035

精通安卓 NDK(四)

原文:zh.annas-archive.org/md5/F3DC9D6FA4DADE68301DCD4BEC565947 译者:飞龙 协议:CC BY-NC-SA 4.0 第八章:编写渲染引擎 在前面的章节中,我们学习了如何组织一个在移动和桌面 OpenGL 之上的薄抽象层。现在,我们可以进入实际的渲染领域,并使用这层来实现一个能够渲染从文件加载的几何图形的 3D 渲染框架,使用材质、光线和阴影。 场景图 场景图是一种常用的数据结构,用于构建空间图形场景的分层表示。第六章《OpenGL ES 3.1 与

龙哥盟 443

OpenGL ES着色器语言之内建函数(官方文档第八章)

转子: http://blog.youkuaiyun.com/wangyuchun_799/article/details/7770500 OpenGL ES着色语言为标量和向量操作定义了一套内建便利函数。有些内建函数可以用在多个类型的着色器中,有些是针对固定硬件的,所以这部分只能用在某个特定的着色器上。        内建函数基本上可以分为一下三类: (1)它们使用一些简便的方

蓝松SDK 807

PBR地面纹理贴图全解析:从Blender到Unity/Unreal的4K材质接入

在三维场景中,基于物理的渲染(PBR)是让材质呈现真实质感的核心技术。与传统的单张贴图不同,PBR材质需要由固有色、法线、粗糙度、金属度和环境光遮蔽等多通道贴图协同工作,才能正确响应光照。许多开发者常因忽略法线或粗糙度通道,导致4K高清纹理依然显得平坦、塑料感强。理解PBR通道原理与颜色空间设置,是提升渲染质量的关键。无论是使用Blender搭建设计节点,还是在Unity或Unreal中连接材质,都需要掌握通道接入流程与参数换算。同时,4K纹理贴图虽能带来丰富细节,但也带来高显存占用和性能压力,需合理设置压

weixin_34248487的博客 338

第二章 OpenGL ES 基础-GLSL语法简单总结

在实际应用中,纹理类型在图形编程中广泛用于渲染纹理、实现阴影效果、生成复杂材质等方面。这些向量类型用于处理不同类型的数据,如位置、方向、颜色、纹理坐标等。:流控制与C语言类似,有if else,switch case,for,while,do while。在 GLSL 中,纹理函数用于从纹理中进行采样和处理像素颜色。:函数的定义与C语言类似,着色器的执行入口也是main()函数。**数组 **:与C语言数组类似,但GLSL中只能使用一维数组。数组:与C语言数组类似,但GLSL中只能使用一维数组。

u012836015的博客 2977

Cinder 创造性编程秘籍(三)

在本章中,我们将学习如何使用和绘制 3D 图形。本章的配方将涵盖以下内容:绘制 3D 几何原语旋转、缩放和移动在离屏画布上绘图使用鼠标在 3D 中绘图添加灯光3D 选择从图像创建高度图使用 Perlin 噪声创建地形保存网格数据在本章中,我们将学习创建 3D 图形的基础知识。我们将使用 OpenGL 和 Cinder 包含的一些有用的包装器来处理一些高级 OpenGL 功能。在这个配方中,我们将学习如何绘制以下 3D 几何形状:立方体球体线环面圆柱体包含必要的头文件以使用 Cinder 命令和语句在 Ope

龙哥盟 635

文档目录索引

qq_39281631的博客 828

gl库的函数

第一章使用颜色 l. l glshadeModel--选择平面明暗模式或光滑明暗模式 1. 2 glColor--设置当前颜色 1. 3 glColorPointer--定义颜色数组 1. 4 gllndex--设置当前颜色索引 1. 5 gllndexPointer--定义颜色索引数组 1. 6 glCOforTableEXT--为目标调色板纹理指定调色板的格式和大小 1. 7 glColors

448

Atitit.计算机图形图像图片处理原理与概论attilax总结

Atitit.计算机图形图像图片处理原理与概论attilax总结 计算机图形1 图像处理、分析与机器视觉(第3版)1 数字图像处理(第六版)2 图像处理基础(第2版)2 发展沿革 1963年,伊凡·苏泽兰(Ivan Sutherland)在麻省理工学院发表了名为《画板》的博士论文, 它标志着计算机图形学的正式诞生。至今已有五十多年的...

weixin_30670965的博客 108

【AI辅助生成】QT Graphs框架技术体系

QT Graphs是Qt 6引入的一种高级3D数据可视化框架,专为科学计算、工程分析和商业智能等领域的复杂数据可视化需求而设计。该框架提供了丰富的图表类型,包括散点图、条形图、曲面图、等高线图等,并支持3D渲染效果,使数据呈现更加直观和具有沉浸感。QT Graphs框架基于Qt 3D模块构建,充分利用了现代GPU硬件加速技术,能够高效处理大规模数据集的可视化任务。与其他Qt模块集成,开发者可以轻松将图表集成到现有应用程序中,并通过Qt Quick或Qt Widgets两种方式进行交互式操作。

QT WIDGETS,QT QML,QT WEB、OpenCV 1061
上一篇: 第七章 opengl之光照(基础光照)
下一篇: 第九章 opengl之光照(光照贴图)
Re_view
博客等级 码龄7年 609粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值