在现实世界里,每个物体会对光产生不同的反应。比如说,钢看起来通常会比陶瓷花瓶更闪闪发光,木头箱子也不会像钢制箱子那样对光产生很强的反射。每个物体对镜面高光也有不同的反应。有些物体反射光的时候不会有太多的散射(Scatter),因而产生一个较小的高光点,而有些物体则会散射很多,产生一个有着更大半径的高光点。如果我们想要在OpenGL中模拟多种类型的物体,我们必须为每个物体分别定义一个材质(Material)属性。

材质是什么呢?其实就是真真切切的物体本身,因为材质物体才会形形色色各式各样,有玉,有铁,有木,等等。我们掌握了材质也就能模拟各种各样的物体,而不局限于单一的color

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

前面说的 环境光 + 漫反射光 + 镜面光 + 散射因子(来表现这个东西到底是什么反光的强度铁就比木头强) 就构成了我们所谓的材质-Material。看到了吧?和我们刚才讲到基本冯氏光照 只差了一个变量,就是用来控制对光的敏感程度额shiness。

你可以看到,我们为每个冯氏光照模型的分量都定义一个颜色向量。ambient材质向量定义了在环境光照下这个物体反射得是什么颜色,通常这是和物体颜色相同的颜色。diffuse材质向量定义了在漫反射光照下物体的颜色。(和环境光照一样)漫反射颜色也要设置为我们需要的物体颜色。specular材质向量设置的是镜面光照对物体的颜色影响(或者甚至可能反射一个物体特定的镜面高光颜色)。最后,shininess影响镜面高光的散射/半径。

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);
}

简单明了,冯氏光照+材质 最后反应出了真是的效果。

我们可以根据不同的shines来体现不同程度的高光,然后通过设置材质的向量属性我们可以把物体变成各种各样的

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);

Opengl-光照-基本光照-材质(有了材质一个物体才算是完整了)相关推荐

  1. 【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )

    文章目录 一.模型准备 二.光照设置 1.启用光照设置 2.启用光源 3.设置光照参数 4.设置环境光 5.设置反射材质 三.光照法线设置 1.设置光源位置 2.设置法线 3.代码示例及运行效果 四. ...

  2. OpenGL学习之光照中的材质

    本文参考LearnOpenGL CN 在现实世界中,每个物体会对光产生不同的反应.比如:钢看起来通常会比陶瓷瓶更闪闪发光,木头箱子也不会像钢制箱子那样对光产生很强的反射.每个梧桐对镜面高光也有不同的反 ...

  3. OpenGL ES 3. 光照-散射光

    大家好,接下来将为大家介绍OpenGL ES 3. 光照-散射光. OpenGL ES 3.0 中采用的光照模型相对现实世界进行了很大的简化,将光照分成了 3 种组成元素(也可以称为 3 个通道),包 ...

  4. opengl光照之光照贴图

    漫反射贴图 我们希望通过某种方式对物体的每个片段单独设置漫反射颜色.有能够让我们根据片段在物体上的位置来获取颜色值得系统吗? 这可能听起来很熟悉,而且事实上这个系统我们已经使用很长时间了.这听起来很像 ...

  5. 【OpenGL学习】光照贴图

    光照贴图 上节中我们给物体添加了材质,使得物体能够对光照做出不同的反应,但是有个问题就是,使用该种材质的物体,只能够表现出我们所定义的一种性质,而实际生活中我们的一个物体往往具有多种材质,因此本节中我 ...

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

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

  7. OpenGL学习笔记——光照(一)

    文章目录 一.颜色 二.光照基础 2.1环境光照 2.2漫反射光照 2.3镜面光照 如何才能更为真实的表现出生活中的环境呢?其实现实生活它已经给了我们答案,就是光照.了解光与颜色构造之间的关系,我们才 ...

  8. unity 2020 怎么写shader使其接受光照?_如何在Unity中造一个PBR Shader轮子

    之前有业界大佬建议我去了解下Unity的PBR.说来惭愧,我查找了下资料才发现自己在这方面的知识居然是一片空白.经过几周的学习与尝试我对这一块算是有了初步的了解,于是写了这篇文章,一方面对自己学到的东 ...

  9. Three.js基础探寻七——Lamber材质与Phong材质

    材质(Material)是独立于物体顶点信息之外的与渲染效果相关的属性.通过设置材质可以改变物体的颜色.纹理贴图.光照模式等. 本篇将介绍基本材质以及两种基于光照模型的材质(Lamber与Phong) ...

最新文章

  1. 自动驾驶技术分级标准微调,全球竞争格局一夜剧变
  2. 计算机二级python用什么书-如何准备全国计算机二级Python?
  3. 笔记本电脑打开后不显示桌面_宝骏630打开空调开关后压缩机不工作 - 汽车空调...
  4. centos mysql 新增用户
  5. 数据聚合Spring Data MongoDB:嵌套结果
  6. windows远程桌面_如何使用Windows远程桌面连接Ubuntu 干货
  7. 使用 Go 实现 TLS socket server
  8. Linux之find常用命令汇总
  9. php mysql 跨库_PHP使用PDO进行跨数据库操作
  10. 多媒体技术教程——信噪比
  11. [线性相关] 皮尔森相关系数的计算及假设检验
  12. 无盘服务器架设之一:编译iPXE,用于网络,ISO,USB等无盘启动
  13. Roaring Bitmap 原理及实践
  14. python编程语言的缺点-多种编程语言的优缺点梳理
  15. 14年macmini装双硬盘_2014款Mac mini拆机更换硬盘
  16. Postman之脚本介绍( pre-request-script )
  17. 大道至简之八:透过现象看本质(房价推手)
  18. Win10屏幕截图自动保存方法
  19. 刚刚搬进公寓,应该每个月交100块网费好还是买个随身WiFi?
  20. Vertiv发布2017年数据中心基础架构趋势

热门文章

  1. linux内核编译及系统裁减
  2. swift tableview 侧滑删除
  3. CLR via C#(17)--接口
  4. Servlet之Filter过滤器
  5. 【转】nagios 命令解释
  6. 增强.net开发的5个非常有用的Visual Studio 2012扩展
  7. ASP.NET MVC 学习1
  8. Oracle WebCenter 11g 快速开发指南--翻译(一)
  9. CHOJ# 在线编译及评判系统(OnlineJudge)2.0 Beta2
  10. python使用方法-六、python 方法的使用