【OpenGL学习】材质

news2024/11/21 0:28:36

材质

在图形学中,材质表示了光线如何和物体进行交互,有了解过 BRDF 的话,实际上 Material == BRDF,有关材质的讲述,可以在这篇文章中了解:计算机图形学(六)——材质 - 知乎 (zhihu.com)。

针对不同的物体,我们可以定义不同的材质属性来进行区分,以此来获得更加真实的效果。

一、添加材质属性

当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。另外再添加一个反光度(shininess)来控制物体的高光半径,一般来说金属具有更高的反光度。

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

uniform Material u_material;

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

二、设置材质

在片元着色器中创建了材质结构体并且创建了全局变量material 之后,需要对其属性进行指定:

		box_shader.set_vec3("material.ambient", glm::vec3(1.0f, 0.5f, 0.31f));
		box_shader.set_vec3("material.diffuse", glm::vec3(1.0f, 0.5f, 0.31f));
		box_shader.set_vec3("material.specular", glm::vec3(0.5f, 0.5f, 0.5f));
		box_shader.set_float("material.shininess", 35.0f);

然后在 shader 中进行计算:

vec3 ambient = light_color * material.ambient;

	vec3 normal = normalize(v_normal);
	vec3 light_dir = normalize(light_pos - v_world_pos);
	vec3 diffuse_color = light_color * max(0.0, dot(normal, light_dir)) * material.diffuse;
	
	vec3 view_dir = normalize(view_pos - v_world_pos);
	vec3 reflect_dir = reflect(-light_dir, normal);
	vec3 specular_color = light_color * pow(max(dot(view_dir, reflect_dir), 0.0), material.shininess) * material.specular;
	
	

	vec3 color = ambient + diffuse_color + specular_color;

运行查看结果:

在这里插入图片描述

可以看到得到的立方体的亮度太亮了,这是因为环境光、漫反射和镜面光这三个颜色都设置为 vec3(1.0f),显然是有问题的,正确的做法是为每个光照分量分别指定一个强度向量。

三、添加光源属性

和物体的材质一样,我们同样在shader中创建一个 Light 结构体来指定光源的属性:

struct Light
{
	vec3 position;

	vec3 ambient;
	vec3 diffuse;
	vec3 specular;
};

一个光源对它的ambient、diffuse和specular光照分量有着不同的强度。环境光照通常被设置为一个比较低的强度,因为我们不希望环境光颜色太过主导。光源的漫反射分量通常被设置为我们希望光所具有的那个颜色,通常是一个比较明亮的白色。镜面光分量通常会保持为vec3(1.0),以最大强度发光。

在循环中进行 uniform 变量指定:

		box_shader.set_vec3("light.position", light_pos);
		box_shader.set_vec3("light.ambient", ambient_color);
		box_shader.set_vec3("light.diffuse", diffuse_color);
		box_shader.set_vec3("light.specular", glm::vec3(1.0f, 1.0f, 1.0f));

之后重新进行计算:

	vec3 ambient = light.ambient * material.ambient;

	vec3 normal = normalize(v_normal);
	vec3 light_dir = normalize(light.position - v_world_pos);
	vec3 diffuse_color = light.diffuse * max(0.0, dot(normal, light_dir)) * material.diffuse;
	
	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) * material.specular;
	
	

	vec3 color = ambient + diffuse_color + specular_color;

得到如下结果:

在这里插入图片描述

如果需要查阅代码, GitHub 地址:OpenGL

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

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

相关文章

Codeforces Round #848 (Div. 2) D - Flexible String Revisit

Codeforces Round #848 (Div. 2) D - Flexible String Revisit 题意:给定两个题意:给定两个题意:给定两个 010101 字符串字符串字符串 aaa 和和和 bbb ,每次操作可选择字符串每次操作可选择字符串每次操作可选择字符串 aaa 上的数…

基于rust的,gRPC动态代理,无需proto文件自动http转gRPC

目录前言grpc实践github地址第一步第二步第三步第四步测试结构和原理尾语前言 沟通服务间接口内容(尤其是前后端接口),是非常让人头疼的事。极其容易扯皮。接口文档写起来也很痛苦,每个字段的改动都需要及时更新,否则就会出问题。服务端通信如…

链表(初学)

n个结点由指针链组成一个链表。链表的结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。链表的每一个结点有两个区域,分别是数据域和指针域。数据域存储的是当前结点的数据值,而指针域存储的是下一个结点的存储地址。…

URL的正则表达式(js代码)

在WWW上,每一信息资源都有统一的且在网上的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址。语法URL由三部分组成:资源类型、存放资源…

2022财年业绩增长乏力渐显,AR电商是Snap下一个突破口吗?

北京时间2月1日,Snap公布了2022财年第四季度和全年财务业绩,财报发布后,Snap盘后股价大幅下跌,最终收跌14.97%。 这并非Snap首次出现公布业绩后股价暴跌的情况,不可否认的是市场的敏锐度十分迅捷。那么,20…

数据结构——栈

一、栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表。 允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO结构。 栈的插入操作,叫作进栈,也称压栈…

不固定版式文档的OCR模型自主开发流程及技术应用实例

随着各行业数字化、智能化建设的脚步加快,OCR得到了普及应用。当前,OCR技术主要应用于标准证件、票据识别,通过自动检测并识别、提取文字,减少人工录入信息的工作量,提升业务效率。目前,企业对OCR的识别精度…

java 分布式缓存 redis持久化 redis主从 Redis哨兵 Redis分片集群

-- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: 数据丢失问题 :Redis是内存存储,服务重启可能会丢失数据 并发能力问题 :单节点Redis并发能力虽然不错,但也无法满足如618这样的高并发场景 故障…

flink学习35:flinkSQL查询mysql

总览: import org.apache.flink.streaming.api.scala._ import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment import org.apache.flink.table.api.EnvironmentSettings import org.apache.flink.table.api.bridge.scala.{StreamTableEnvi…

day 23 贪心

P4447 [AHOI2018初中组]分组要求分成的每个小组的队员实力值连续,同时,一个队不需要两个实力相同的选手满足所有人都恰好分到一个小组,使得人数最少的组人数最多,输出人数最少的组人数的最大值。注意:实力值可能是负数…

【软件测试】 MySQL数据库总结,表的一系列操作,你看的都用得到......

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

ROS小车研究笔记2/2/2023 激光雷达建图

1 启动激光雷达建图节点 roslaunch turn_on_wheeltec_robot mapping.launch 2 启动rviz使建图可视化 rviz 在rviz中如果出现小车坐标错误,如小车坐标倾斜,可以按单片机上的RESET键使里程计复位。 我在测试中还出现启动mapping.launch后持续显示无法启动…

2023牛客寒假算法基础集训营5 -- C - 小沙の不懂

题目如下&#xff1a; 题目描述 输入描述: 输入两个整数 a, b, 0≤a,b<101050 \le a, b < 10^{10^5}0≤a,b<10105 输出描述: 如果在每一种情况中 a>ba>ba>b, 则输出">“。 如果在每一种情况中 a<ba<ba<b, 则输出”<“。 如果在每一种…

KT6368A双模蓝牙芯片功能 参数 应用 等等介绍

目录 一、KT6368A蓝牙芯片的基本介绍 二、KT6368A的功能介绍 三、KT6368A应用场景介绍 四、KT6368A的扩展说明 一、KT6368A蓝牙芯片的基本介绍 先看看官网的简单介绍&#xff1a; KT6368A芯片是一款支持蓝牙双模的纯数据芯片&#xff0c;蓝牙5.1版本。芯片的亮点在超小尺…

2022年重回王座,通用汽车电气化前景几何?

北京时间1月31日&#xff0c;美国汽车巨头通用汽车发布2022财年年报&#xff0c;第四度业绩超预期。 据通用汽车财报显示&#xff0c;其2022年Q4实现营收431.08亿美元&#xff0c;市场预期为406.5亿美元&#xff0c;摊薄调整后每股收益为2.12美元&#xff0c;市场预期为1.69美…

开学礼物送什么给孩子有意义?盘点最好的开学礼物之护眼台灯

即将开学啦&#xff0c;很多家长会给孩子准备开学的礼物&#xff0c;鼓励孩子春季新学期好好学习。 那么在开学送哪些礼物能显现出家长的良苦用心呢&#xff1f;也是随着这几年儿童近视率逐渐上升&#xff0c;近视成为许多家长担忧的问题&#xff0c;能更好的预防近视&#xf…

mongodb副本集部署及springboot集成

一、mongodb应用安装1、官网下载mongodb的社区版https://www.mongodb.com/try/download/community2、离线安装将下载好的mongodb安装包上传至服务器指定目录病解压&#xff08;1&#xff09;配置环境变量export MONGO_HOME/home/master/mongodb/mongo export PATH$MONGO_HOME/b…

自定义注解

如何实现自定义注解在我们实际开发过程中如果能合理的运用自定义注解&#xff0c;则会大大减少我们代码的开发量。那怎么才能实现自定义注解呢&#xff1f;废话不多说&#xff0c;直接上干货&#xff01;一、创建注解这一步呢&#xff0c;我们可以理解成对应的实体类&#xff0…

BetaFlight统一硬件资源抽象设计

BetaFlight统一硬件资源抽象设计1. 源由2. 资源配置注意事项3. 资源配置文件修改验证步骤Step 1&#xff1a;确认硬件修改内容Step 2&#xff1a;资源配置文件修改Step 3&#xff1a;验证配置文件Step 4&#xff1a;提交资源配置文件PR4. 参考资料就笔者接触嵌入式设计以来&…

ESP32设备驱动-MAX44009环境光传感器驱动

MAX44009环境光传感器驱动 文章目录 MAX44009环境光传感器驱动1、MAX44009介绍2、硬件准备3、软件准备4、驱动实现1、MAX44009介绍 MAX44009 环境光传感器具有 IC 数字输出,非常适合智能手机、笔记本电脑和工业传感器等多种便携式应用。 它的工作电流小于 1A,是业内功耗最低…