OpenGL(十一)——材质

news2024/11/23 12:41:16

目录

一、前言

二、物体材质

三、光源材质


一、前言

OpenGL材质是模拟现实世界中不同材质物体表面,如木制箱子和钢制箱子对光的反射程度不同。物体材质对接受光散射程度不同,较少散射产生较小高光点,较多散射则会产生较大高光点。前面章节定义了物体颜色、环境光照、漫反射、镜面反射,本文再添加一个反光度分量,则可以表达材质所有属性。

模拟现实世界物体表面材质,会使得渲染图形接收光照后更加逼真,物体材质的所有属性分量包括环境光照ambient、漫反射光照Diffuse、镜面光照Specular Lighting、反射度Shining。


  • ambient材质向量定义在环境光照下这个表面反射的是什么颜色,通常与表面的颜色相同
  • diffuse材质向量定义在漫反射光照下表面的颜色。漫反射颜色(和环境光照一样)也被设置为我们期望的物体颜色
  • specular材质向量设置的是表面上镜面高光的颜色(或者甚至可能反映一个特定表面的颜色
  • shininess影响镜面高光的散射/半径

二、物体材质

#version 330 core

struct Material{
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float shininess;
};

out vec4 FragColor;

in vec3 Normal;  //法向量:垂直于顶点表面的向量
in vec3 FragPos;  //片段位置向量:世界坐标系下
  
uniform vec3 lightPos; //光源位置向量
uniform vec3 viewPos; //观察者位置向量

uniform vec3 lightColor;
uniform Material 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);
    
    // 镜面反射 + 反光强度Shininess(镜面高光散射半径)
    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);
} 
        ObjShader.setVec3("material.ambient", 1.0f, 0.5f, 0.31f);
        ObjShader.setVec3("material.diffuse", 1.0f, 0.5f, 0.31f);
        ObjShader.setVec3("material.specular", 0.5f, 0.5f, 0.5f);
        ObjShader.setFloat("material.shininess", 32.0f);

 

三、光源材质

上述光源反射太亮了,原因是环境光、漫反射、镜面光对物体全力反射。, 光源对这三种分量有不同的强度,设置光源的“材质”来限制这三个分量的强度。在着色器中进一步增加光源材质结构体:

......
struct Light{
    vec3 position;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};

......
uniform Light light;

void main()
{
    // 环境光照
    vec3 ambient =light.ambient * material.ambient;
    // 漫反射 
    ......
    vec3 diffuse = light.diffuse*(diff * material.diffuse);
    // 镜面反射 + 反光强度Shininess(镜面高光散射半径)
    ......
    vec3 specular = light.specular*(spec * material.specular);  

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

app

        ObjShader.setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
        ObjShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f); // 将光照调暗了一些以搭配场景
        ObjShader.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);

 

参考:

材质 - LearnOpenGL CN (learnopengl-cn.github.io)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何节约ChatGPT消耗的token

如何节约GPT的token.md 原文链接:小回博客 如何节约GPT的token 一、模拟一下携带上下文的流程: 第1次问答: 你:帮我写一个1000字的文案(13) gpt: xxxxxx (1000)第2次问答: 你:谢…

《我命由我不由天》蔡志忠——笔记三

目录 经典摘录 1、大脑是用来思考的 2、养生主 3、自己的问题,自己找答案 4、42岁自学英文 5、终身阅读 6、打不垮我们的终究使我们更强大 7、大环境下失业 8、生命只能兑现此刻 经典摘录 1、大脑是用来思考的 罗素非常反对制式教育,他说&#…

有哪些比较好的测试用例管理工具?

“新入职小型创业公司,想要一个比Excel高效且好用的工具。”我预料很多人会提TestLink、Jira、PingCode 等一堆平台,都2023年了,若还是复制粘贴的10年前这一套,那就让人看不下去了。为了让大家少走弯路,所以我写了这篇…

【自用】配置minGW、vscode配置ESP-IDF环境

步骤总览 1.配置minGW 2.下载安装esp-idf软件 3.将vscode esp-idf插件 和 esp-idf软件进行关联 一、配置minGW 1.下载 链接:https://pan.baidu.com/s/1j6ITlNDDyivKwpWNBjASvg?pwd0108 提取码:0108 2.解压 解压上面下载的压缩包即可 3.配置环境变…

EFDC建模方法及在地表水环境评价、水源地划分、排污口论证应用

目录 专题一 软件安装 专题二 EFDC模型讲解 专题三 一维河流模拟实操(上机操作) 专题四 建模前处理(上机操作) 专题五 EFDC网格剖分介绍(上机操作) 专题六 EFDC二维湖库水动力模拟/非保守染色剂模拟&…

prometheus监控数据持久化

前置条件 1.规划两台主机安装prometheus # kubectl get nodes --show-labels | grep prometheus nm-foot-gxc-proms01 Ready worker 62d v1.23.6 beta.kubernetes.io/archamd64,beta.kubernetes.io/oslinux,kubernetes.io/archamd64,kubernetes.io…

5.Redis持久化

5.Redis持久化 总体介绍持久双雄一图:Redis persistence RDB(Redis Database)官网介绍RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。能干嘛?案例演示:需求…

图像处理——连接IP摄像头上传到服务器实现目标识别

前言 1.项目的需求是,本地连接IP摄像头,然后把图像上传到图像处理服务器器进行处理,得到的结果返回本地。 2.IP摄像头使用的是大华的摄像头,目标识别用的yolov5的模型,服务器用的是flask,实现语言是pytho…

【闪击Python】字符串的创建和驻留机制

💌 博客内容:字符串的创建和驻留机制 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家&#x…

Dear Reality 发布全新 EXOVERB MICRO 混响插件

空间感混响效果新高度 Dear Reality 发布全新 EXOVERB MICRO 混响插件 Dear Reality 针对立体声制作推出最新的混响插件 EXOVERB MICRO,提供一流的真实感和空间感混响效果,将立体声混音技术提升至新高度。这个紧凑型音频插件功能非常强大,采…

得物社区亿级ES数据搜索性能调优实践

1.背景 2020年以来内容标注结果搜索就是社区中后台业务的核心高频使用场景之一,为了支撑复杂的后台搜索,我们将社区内容的关键信息额外存了一份到Elasticsearch中作为二级索引使用。随着标注业务的细分、迭代和时间的推移,这个索引的文档数和…

VisualStudio2022配置PCL点云库教程

属性管理器 首先,打开属性管理器:视图–其他窗口–属性管理器 打开后如图所示,选中Debug|x64,右键单击,选择属性 如图所示,需要修改的是VC目录中的包含目录和库目录: ** 包含目录 添加内容…

Andorid:日常学习笔记(3)——掌握日志工具的使用

使用Android的日志工具Log 方法: Android中的日志工具类为Log,这个类提供了如下方法来供我们打印日志: 使用方法: Log.d("MainActivity","onCreate execute"); 第一个参数tag:一般传入当前类名就好,主要用于队打印信息进行过滤.第二个参数:msg,具体想打…

如何成为一位测试开发工程师?测试开发的核心竞争力...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 抛出一个问题&…

【操作系统】第2章进程同步、PV操作、死锁

一、进程同步 1、 定义 (1) 临界资源:把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(摄像头、打印机)和许多变量、数据、内存缓冲区都属于临界资源。 对临界资源的访问必须互斥地进行。 ① 进入…

【软考】中级 | 数据库系统工程师 | 笔记总结

📢博客主页:肩匣与橘 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由肩匣与橘编写,首发于CSDN🙉 📢生活依旧是美好而又温柔的,你也…

解决winstore下载mincraft 出现错误提示的问题

mincraft 点开显示此应用无法在你的电脑上运行,去C:\XboxGames\Minecraft Launcher\Content下看了下: 但是别人电脑上相同目录下一样的文件能运行,于是选择重装,但是刚开始下载就遇到这个问题: 商店提示这个 点开一…

Ansys Zemax | 计算任意温度和压强下的折射率

概述 这篇文章介绍了OpticStudio如何计算材料在任意输入波长、环境温度和压强下的折射率。 介绍 通常情况下有两种参考折射率的测量方法:绝对测量和相对测量。其中绝对测量以真空为参考介质;相对测量则是以空气(摄氏温度20,一个标…

MySQL之盛放记录的大盒子 【InnoDB 数据页结构】

前言 本文章收录在MySQL性能优化原理实战专栏,点击此处查看更多优质内容。 本文摘录自 ▪ 小孩子4919《MySQL是怎样运行的:从根儿上理解MySQL》 学完了记录结构,我们该学数据页的结构,前边我们简单的提了一下页的概念&#xff…

臻图信息利用数字孪生构建生态环境智慧监测系统

2月27日,中共中央国务院印发《数字中国建设整体布局规划》中指出,要推动生态环境智慧治理,加快构建智慧高效的生态环境信息化体系,建设绿色智慧的数字生态文明。 生态环境监测是生态环境保护的基础,是生态文明建设的重…