光照贴图

上节中我们给物体添加了材质,使得物体能够对光照做出不同的反应,但是有个问题就是,使用该种材质的物体,只能够表现出我们所定义的一种性质,而实际生活中我们的一个物体往往具有多种材质,因此本节中我们使用漫反射贴图和镜面反射贴图对物体的漫反射分量和镜面反射分量有着更为精确的控制。

一、漫反射贴图

漫反射贴图允许我们对物体的每个点单独指定漫反射颜色。比如我们想让之前的立方体表面看起来像一个木箱子,就可以用下面这张帖图:

可以通过纹理采样来获得该点所对应的漫反射颜色,首先在material 结构体中创建一个采样器 sampler2D 来替换之前创建的 vec3 变量 diffuse:

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

同时由于环境光照的颜色和漫反射颜色相同,所以我们移去了环境光照分量。此外,我们还需要获得每一个片元对应的纹理坐标,因此在修改顶点数组之后,重新指定GPU内存布局:

layout(location = 0) in vec3 a_position;
layout(location = 1) in vec3 a_normal;
layout(location = 2) in vec2 a_texcoord;out vec3 v_normal;
out vec3 v_world_pos;
out vec2 v_texcoord;

记得去更新两个VAO的顶点属性指针来匹配新的顶点数据,然后可以将原来 diffuse 变量位置的内容替换为 :

vec3 ambient_color = light.ambient * texture(material.diffuse, v_texcoord).rgb;
vec3 diffuse_color = light.diffuse * max(0.0, dot(normal, light_dir)) * texture(material.diffuse, v_texcoord).rgb;

还需要做的一件事就是给当前的纹理绑定纹理单元,然后赋值到 material.diffuse 采样器:

box_shader.set_int("material.diffuse", 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, diffuse_map);

稍稍运行看一下结果:

此时我们的立方体看上去就像一个木箱子了,这是因为漫反射贴图就像是一张画布一样贴在了立方体的表面。

二、镜面光贴图

镜面光贴图就是能够对物体表面的高光部分进行精准控制的贴图,就比如上面的立方体箱子当中,我们希望木头的部分没有镜面反射,金属的部分有镜面反射,我们就可以利用下面这张帖图:

和之前的操作一样,我们也对镜面高光贴图进行采样,因此修改之前 shader 中的 specular 变量为 samper2D:

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

设置全局变量并绑定纹理单元:

     box_shader.set_int("material.specular", 1);   glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, specular_map);

重新计算镜面高光部分:

 vec3 view_dir = normalize(view_pos - v_world_pos);vec3 reflect_dir = reflect(-light_dir, normal);vec3 specular_color = light.specular * pow(max(dot(view_dir, reflect_dir), 0.0), material.shininess) * texture(material.specular, v_texcoord).rgb;

运行结果是这样的:

这次镜面高光只在金属部分出现了。

【OpenGL学习】光照贴图相关推荐

  1. OpenGL Lightmap光照贴图的实例

    OpenGL Lightmap光照贴图 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include ...

  2. OpenGL学习: 光照系列3-光源类型和使用多个光源

    写在前面  上一节光照中使用材质和lighting maps介绍了使用材质属性和lighting maps使物体的光照效果能反映物体的材料特性,看起来更逼真.在前面的章节中使用的实际上都是一个点光源, ...

  3. OpenGl L9光照贴图

    一.光照贴图 在上一节中,我们将整个物体的材质定义为一个整体,但现实世界中的物体通常并不只包含有一种材质,而是由多种材质所组成. 比如一辆汽车:它的外壳非常有光泽,车窗会部分反射周围的环境,轮胎不会那 ...

  4. OpenGL学习笔记(四)-光照-材质-光照贴图

    参考网址:LearnOpenGL 中文版 哔哩哔哩教程 第二章 光照 2.1 颜色 现实生活中人眼看到某一物体的颜色,是它所反射的颜色.如将白光照在红色的玩具上,玩具会吸收白光中除了红色以外的所有子颜 ...

  5. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  6. OpenGL 光照贴图Lighting maps

    OpenGL光照贴图Lighting maps 光照贴图Lighting maps简介 漫反射贴图 镜面光贴图 采样镜面光贴图 光照贴图Lighting maps简介 在上一节中,我们讨论了让每个物体 ...

  7. opengl高级光照之视差贴图(陡峭视差贴图以及视差遮蔽映射)

    视差贴图 视差贴图官方文档 视差贴图 视差贴图(Parallax Mapping)技术和法线贴图差不多,但它有着不同的原则.和法线贴图一样视差贴图能够极大提升表面细节,使之具有深度感.它也是利用了视错 ...

  8. OpenGL学习入门之3D光照机器人

    OpenGL学习入门之3D光照机器人 // myopengl.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include " ...

  9. OpenGL光照贴图

    光照贴图 1. 光照贴图的意义 2. 漫反射贴图 3. 镜面光贴图 1. 光照贴图的意义 现实世界中的物体通常并不只包含有一种材质,而是由多种材质所组成.只有光照颜色的材质系统是不够的,它只是一个最简 ...

最新文章

  1. 极客新闻——04、WiFi万能钥匙万玉权:管理应该是“自下而上”
  2. GitHub超3万星最全面试题库:计算机面试题一网打尽
  3. 【转】HashMap集合中key只能为引用数据类型,不能为基本类型
  4. android单片机蓝牙小车,手把手教你做蓝牙小车
  5. SAP Hybris backoffice登录时的语言选择
  6. 寒哥细谈之AutoLayout全解
  7. P5516-[MtOI2019]小铃的烦恼【期望dp,线性消元】
  8. 找2个数组中相同的数
  9. Java Servlet web xml 配置详解
  10. 大数据分析入门小技巧
  11. iOS 开发笔记-plist使用
  12. 东芝服务器报错误代码维修,实战维修 东芝复印机故障维修详解
  13. Windows安全中心无法使用解决方法
  14. 02-Epicor二次开发常用代码
  15. TVM: End-to-End Optimization Stack for Deep Learning
  16. 【收藏】通信知识分类整理
  17. html微信朋友圈demo,Vue.js实现模拟微信朋友圈开发demo
  18. 经典解读商业智能BI、大数据、数据中台三者关系
  19. 快速了解Log4J (转)
  20. 关于cmd打开时提示“系统找不到指定的路径”问题

热门文章

  1. torch编程-加载预训练权重-模型冻结-解耦-梯度不反传
  2. 全网最通俗的条件随机场CRF
  3. 存储器的整体概述(内存、外存、ROM、RAM)
  4. 可视化色码表--绘图视觉不可或缺的元素
  5. SEO 查看网站权重的工具
  6. Android实现的电子木鱼,功德+1...
  7. 操作系统高级课程-1
  8. Latex 定义definition
  9. HTML+CSS+JS 网页设计期末课程大作业(旅游景点--南京 15页) web前端开发技术 web课程设计 网页规划与设计
  10. c 语言10个数首尾连接,相邻4个和,西安交通大学18年9月课程考试《计算机控制技术》作业考核试题答案...