第九章 opengl之光照(光照贴图)

GraphicsLab Project之辉光(Glare,Glow)效果 详细讲述了如何在OpenGL中使用GLSL实现辉光特效 阅读详情

光照贴图

一个物体的不同部分是不同的材质,那么会有不同的环境光和漫反射颜色表现。

漫反射贴图

原理就是:纹理。
是对同样的原理使用了不同的名字:其实都是使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。是一个表现了物体所有的漫反射颜色的纹理图像。

在着色器中使用漫反射贴图的方法和纹理教程中是完全一样的。但这次我们会将纹理储存为Material结构体中的一个sampler2D。我们将之前定义的vec3漫反射颜色向量替换为漫反射贴图。
补充:sampler2D是所谓的不透明类型(Opaque Type),也就是说我们不能将它实例化,只能通过uniform来定义它。如果我们使用除uniform以外的方法(比如函数的参数)实例化这个结构体,GLSL会抛出一些奇怪的错误。这同样也适用于任何封装了不透明类型的结构体。

也需要移除环境光材质颜色向量,因为环境光颜色在几乎所有情况下都等于漫反射颜色,所以我们不需要将它们分开储存:

struct Material {
    sampler2D diffuse;
    vec3      specular;
    float     shininess;
}; 
...
in vec2 TexCoords;

在片段着色器中再次需要纹理坐标,所以我们声明一个额外的输入变量。接下来我们只需要从纹理中采样片段的漫反射颜色值即可:

vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));

将环境光的材质颜色设置为漫反射材质颜色同样的值:

vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));

补充:
GLSL内建的texture()函数,可以得到一个纹理颜色,第一个参数纹理采样器,第二个参数纹理坐标。

上述这就是使用漫反射贴图的全部步骤了。
下面需要使用纹理坐标更新顶点数据,将它们作为顶点属性传递到片段着色器,加载材质并绑定材质到合适的纹理单元。
更新顶点着色器来以顶点属性的形式接受纹理坐标,并将它们传递到片段着色器中:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoords;
...
out vec2 TexCoords;

void main()
{
    ...
    TexCoords = aTexCoords;
}

还需要更新两个VAO的顶点属性指针来匹配新的顶点数据,并加载箱子图像为一个纹理。在绘制箱子之前,我们希望将要用的纹理单元赋值到material.diffuse这个uniform采样器,并绑定箱子的纹理到这个纹理单元:

lightingShader.setInt("material.diffuse", 0);
...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, diffuseMap);

镜面光贴图

想要让物体的某些部分以不同的强度显示镜面高光。
可以使用一个专门用于镜面高光的纹理贴图。这也就意味着我们需要生成一个黑白的(如果你想得话也可以是彩色的)纹理,来定义物体每部分的镜面光强度:
镜面高光的强度可以通过图像每个像素的亮度来获取。镜面光贴图上的每个像素都可以由一个颜色向量来表示,比如说黑色代表颜色向量vec3(0.0),灰色代表颜色向量vec3(0.5)。在片段着色器中,我们接下来会取样对应的颜色值并将它乘以光源的镜面强度。一个像素越「白」,乘积就会越大,物体的镜面光分量就会越亮。

要保证正确地加载图像并生成一个纹理对象。由于我们正在同一个片段着色器中使用另一个纹理采样器,我们必须要对镜面光贴图使用一个不同的纹理单元,所以我们在渲染之前先把它绑定到合适的纹理单元上:

lightingShader.setInt("material.specular", 1);
...
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, specularMap);

接下来更新片段着色器的材质属性,让其接受一个sampler2D而不是vec3作为镜面光分量:

struct Material {
    sampler2D diffuse;
    sampler2D specular;
    float     shininess;
};

采样镜面光贴图,来获取片段所对应的镜面光强度:

vec3 ambient  = light.ambient  * vec3(texture(material.diffuse, TexCoords));
vec3 diffuse  = light.diffuse  * diff * vec3(texture(material.diffuse, TexCoords));  
vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
FragColor = vec4(ambient + diffuse + specular, 1.0);

通过使用镜面光贴图我们可以可以对物体设置大量的细节,比如物体的哪些部分需要有闪闪发光的属性,我们甚至可以设置它们对应的强度。镜面光贴图能够在漫反射贴图之上给予我们更高一层的控制。

OpenGL学习笔记(四)-光照-材质-光照贴图 参考网址:LearnOpenGL 中文版 哔哩哔哩教程 第二章 光照 2.1 颜色 现实生活中人眼看到某一物体的颜色,是它所反射的颜色。如将白光照在红色的玩具上,玩具会吸收白光中除了红色以外的所有子颜色,不被吸收的红色光被反射到我们的眼中,让这个玩具看起来是红色的。 该颜色反射的定律运用在OpenGL时,给定光源颜色,把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色。 glm::vec3 ambientColor(0.0f, 1.0f, 0.0f); glm::vec3 objColor( 阅读详情

相关推荐

第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标

GL_TRIANGLE_STRIP:指定要绘制的基本图元类型为三角形条带,即每三个顶点定义一个三角形,但从第三个顶点开始,每个新顶点都与前两个顶点一起构成一个新的三角形。坐标系 的 左下点(-1, -1),右下角(1,-1) , 左上角(-1, 1) , 右上角(1 , 1)坐标系 的 左下点 (0, 0),右下角(1 , 0) , 左上角(0, 1 ), 右上角(1, 1)0:指定了要渲染的顶点数组的起始索引,这里表示从顶点数组的第一个顶点开始。使用第二个顶点作为三角形条带的第二个顶点。

u012836015的博客 3536

OpenGL光照模型--四种光照效果

OpenGL光照模型           为了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去和一个二维平面上圆没什么差别,如下图,左边为有光照效果的球体,右边为同一个球体但没有设置光源,看上去就没有立体效果,因此OpenGL 光照效果对显示3D效果非常明显。 在OpenGL 光照模型中光源和光照效果可以细分为红,绿,蓝三个部分,光源由红,绿,蓝强度来定义,而物体表面材料

民ming 9806

GraphicsLab Project之光照贴图烘焙(一)

作者:i_dovelemon 来源:优快云 日期:2018-05-19 主题:Radiosity Algorithm, Global Illumination, Barycentric Coordinate 引言 早在Quake的时代,卡马克就首创了使用Surface Caching来实现预先烘焙的光照贴图(Light Map)效果。在这之后,光照贴图实现的GI效...

i_dovelemon的专栏 6730

【OpenGL】笔记十三、光照贴图

1. 流程 简单的光照材质无法满足要求,接下来我们要对不同材质的物体在各个片段的反射做出精准控制 1.1 漫反射贴图 之前,我们对物体的漫反射做了简单的单色定义,现在我们加入纹理贴图,让纹理的颜色作为漫反射的颜色: ...

ycrsw的博客 846

【OpenGL学习】光照贴图

漫反射贴图和镜面高光贴图初尝试

miyazono_的博客 740

一文剖析3D勋章实现方案:从建模到加载解析渲染

本文介绍了在OpenGL ES中实现3D勋章效果的技术方案。文章首先展示了3D勋章运行效果图,随后分析了实现过程中的三大难点:如何加载.obj与.mtl文件、动画效果实现以及光照模拟。作者设计了一个分层架构,包括底层文件解析引擎、光照系统和动画引擎。重点阐述了自定义的.obj/.mtl解析方案,参考Cocos2d设计的动画引擎架构,以及模拟环境光、散射光和镜面光的光照系统实现。通过反射调用和差值器控制,使勋章具有生动的动画效果。该方案成功解决了3D模型加载、动画控制和光照模拟等关键技术问题。

bjxiaxueliang的CODING小栈 5761

OpenGl第九章 光照贴图

//LightingMaps #include "Shader.h" #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #include <glad/glad.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.h

ahang的博客 262

OpenGL使用CG实现发光效果

OpenGL使用CG语言实现发光效果,C/C++源码,使用VS2013编译。其它版本编译器需要改下配置文件也可以编译。适合GPU编程初学者入门看。

《OpenGL超级宝典4》学习笔记——第九章(一)

转载:http://blog.youkuaiyun.com/houdy/article/details/145444 纹理坐标生成: 在OpenGL1.1中,可以指定三种纹理坐标生成模式:GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP,在OpenGL1.3中,又添加了两种生成模式:GL_REFLECTION_MAP,GL_NORMAL_MAP.对这些模式的理解

自然的专栏 1431

OpenGLCG_opengl实现发光线_nvGlutManipulators_

能通过这色器实现物体发光效果,可直接使用

关于光耦隔离与SP3485E芯片一起使用无法拉高485使能引脚问题

最近在做的一个项目,定制了一块STM32F407ZG的工控板,工控板载4个485接口全部都是只能接收数据,不能对外发送数据。1.接线不正确:接线不正确导致485收发出现问题。 2.程序端口初始化问题:控制光耦隔离的输入脚IO的初始化和置位状态有问题。 3.GPIO复用问题:控制对应串口的GPIO不是正点原子默认的GPIO,而是经过复用的其他IO,复用问题。 4.程序设置与485E芯片收发模式不对应:对于使能引脚的电平要根据光耦的输出情况确定输入IO与RE的关系,可能模式没有对应。 5.光耦隔离或者SP485

weixin_45862642的博客 2978

OpenGL超级宝典笔记5

第八章 基本纹理贴图 学习如何加载纹理对象以及如何使用纹理坐标把图像贴图到几何图形的顶点。还学习对纹理图像进行过滤以及与几何图形颜色值进行混合的不同方法,并学习如何使用mip贴图来提高性能和改善视觉精度。讨论如何管理多个纹理以及如何在它们之间进行快速和方便的切换,并告诉OpenGL在可以使用高性能的纹理内存时哪个纹理具有更高的优先级。 a) 加载纹理 通过glTextImage根函数加载一维、

likandmydeer的专栏 1260

Shopee前端反爬三要素:x-sap-Ri、x-sap-Sec与af-ac-enc-dat深度解析

电商前端反爬机制本质是运行时环境可信验证,其核心在于动态生成的请求指纹、会话签名与行为加密载荷。这类机制不依赖静态Token,而是基于浏览器真实交互(如鼠标轨迹、页面可见性、时间精度)实时计算,体现JS运行时环境不可模拟性。技术价值在于将风控前移至客户端,大幅提升自动化绕过成本;典型应用场景包括商品价格监控、竞品数据采集与合规爬虫开发。本文聚焦Shopee实战案例,深入拆解x-sap-Ri(设备+行为哈希指纹)、x-sap-Sec(动态密钥签名)及af-ac-enc-dat(AES加密行为载荷)三大字段的生

weixin_29015127的博客 406

光照贴图(个人笔记)

光照贴图

zaizai1007的博客 2617

IEEE论文投稿必看:PDF eXpress报错font not embedded的3种修复方法(附Adobe Acrobat DC操作截图)

本文针对IEEE论文投稿时PDF eXpress系统常见的“font not embedded”报错,提供了三种核心修复方案。首先,详细解析了使用Adobe Acrobat DC进行专业修复的完整操作流程与关键技巧。其次,介绍了无需付费软件的开源与免费工具链(如Ghostscript)解决方案。最后,从源头出发,指导LaTeX和Microsoft Word用户在生成PDF时正确设置以确保字体自动嵌入,帮助研究者彻底解决格式问题,确保投稿顺利。

ujm56789012的博客 516

A股量化实战:用Python回测动量因子策略(附聚宽完整代码)

本文详细介绍了如何在A股市场使用Python和聚宽平台,实战回测一个动量因子量化交易策略。从环境搭建、数据获取到完整的策略代码实现与回测分析,手把手教你验证“强者恒强”的投资逻辑,并提供参数优化与实战避坑指南,助力量化新手迈出第一步。

weixin_29264201的博客 972

光照 (5) 光照贴图

在片段着色器中,我们接下来会取样对应的颜色值并将它乘以光源的镜面强度。一个像素越「白」,乘积就会越大,物体的镜面光分量就会越亮。镜面高光的强度可以通过图像每个像素的亮度来获取。镜面光贴图上的每个像素都可以由一个颜色向量来表示,比如说黑色代表颜色向量。允许我们对物体的漫反射分量(以及间接地对环境光分量,它们几乎总是一样的)和镜面光分量有着更精确的控制。使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。表现了物体所有的漫反射颜色的纹理图像。物体的某些部分以不同的强度显示镜面高光。

thefist的专栏 418

Mathtype公式排版避坑指南:固定行距20磅下如何完美显示上下标(实测有效)

本文针对学术论文在固定行距20磅要求下,Mathtype公式上下标显示不全或被裁剪的问题,提供了实测有效的解决方案。文章深入剖析了固定行距与公式排版的冲突原理,并详细指导用户通过调整Mathtype的“定义间距”参数(如下标深度、上标高度),以及利用“格式化公式”功能进行批量处理,确保公式在严格遵守期刊格式要求的同时清晰完整显示。

weixin_29228203的博客 1069

论文阅读-《用于有效计算间接照明的不完美阴影贴图》

提示:源文 Imperfect Shadow Maps for Efficient Computation of Indirect Illumination ,是给虚拟点光源的间接光照做阴影的(使用不完美阴影贴图)。 核心就是近似可见性。 文章目录摘要一、介绍二、相关工作三、不完美的阴影贴图1.场景预处理2.创建ISM3.讨论四、使用 ISM 的间接照明1.多次反弹五、结果1.ISM 的其他应用总结 摘要 提示:这里可以添加本文要记录的大概内容: 作者提出了一种基于近似可见性查询的大型和全动态场景中间.

wqdqwass的博客 637

iOS WKWebView H5微信支付跳转

iOS WKWebView H5微信支付跳转 需求:iOS客户端实现嵌入H5进行微信支付跳转到微信客户端,支付完成后再跳转回我们的APP,解决WKWebView无法跳转回APP的BUG. 阅读前提: 了解WKWebView基本初始化及使用 了解如何利用URL Schemes进行应用间跳转 公司或个人已经在微信后台注册了一级域名 GitHub地址(附代码) :iOS WKWebView H5微信支付跳转 简书地址 :iOS WKWebView H5微信支付跳转 博客地址 :iOS WKWe...

ForeverMyheart的博客 2047

大疆sdkV4以及V5webrtc推流

webrtcSDK中要用它的VideoCapturer来初始化推流 ViewdoCapturer是一个接口我们继承它 然后重建创建文件CapturerAircraft.java文件。CameraUtil.java这个是我们用来创建CapturerAircraft的一个工具。除了CapturerAircraft这个文件不一样外其他都是一样的。PlayBodyBean.java这个是我们的配置文件。下面的有个代码块第一个是v4的 第二个是v5的。接着我们来创建几个推流用到的webrtc工具。

weixin_41624865的博客 1188

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

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

Re_view的博客 1346

Autosar代码包初识 2 - 如何编译Vector包内Demo工程

Vetcor autosar代码包Demo工程编译,GreenHills,RH850,Autosar,Davinci COnfigurator

weixin_42412049的博客 5185

用glLightfv函数实现简单的光照效果

制作真实的动画需要添加光照效果, 首先介绍OpenGL的简单光照模型,它的反射光可以分为三个分量:环境反射光,漫反射光,镜面反射光。就是你要实现一个光照效果,需要设置这三个分量,三者之和达到你想要的光照效果。 1.环境光,简单来说就是环境中的光,似乎来自于各个方向 2.漫反射,来自一个方向,光它照射到物体上,则在各个方向上均匀地发散出去,不管视点在哪,物体都是一样亮。 3.镜面光,来自特定方向,并沿着另一方向反射出去。 ...

weixin_63545354的博客 2764

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C# SharpGL-Light光源

写在最前面的话:光源是OpenGL里非常重要的一部分,内容比较多也比较深,未必能够全部整理的清楚,若有整理不当或需补充的地方,还望各位大虾多多指点。 光源在我们身边无处不在,

归离的博客 2202

Camera2Demo

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

OpenGL 4种光照模型

////////////////////////////////////////////////////////////////////////////////// 什么是光照模型 每个像素都是颜色值,但是要获得这个颜色值,你要观察这个像素所处的整个环境。 一.综述 本篇文章主要概述真实感渲染中光照模型的主要理论和技术手段,细节步骤等重要问题将再以后阐述。 真实感渲染和非真实感的区别 开始之前,还是要理解一下题目中的反面:什么是非真实感渲染? 早期非真实感渲染的支持者致力于绘制媒质的仿..

蛰伏--当你不够强大时,就不要放弃努力 3037
上一篇: 第八章 opengl之光照(材质)
下一篇: 第十章 opengl之光照(投光物)
Re_view
博客等级 码龄7年 609粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值