LearnOpenGL(九)之材质

ops/2024/9/24 9:54:01/

一、材质

在现实世界里,每个物体会对光产生不同的反应。比如,钢制物体看起来通常会比陶土花瓶更闪闪发光,一个木头箱子也不会与一个钢制箱子反射同样程度的光。在opengl中,我们可以针对每种表面定义不同的材质(Material)属性来模拟该效果。

在前一篇文章中,我们分别学习了环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。现在,我们再添加一个反光度(Shininess)分量,结合这三个材质颜色,我们就有了全部所需的材质属性了:

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

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

有这4个元素定义一个物体的材质,我们能够模拟很多现实世界中的材质。下图展示了几组现实世界的材质参数值对我们的立方体的影响:

二、设置材质

首先,修改片段着色器如下:

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

然后,将环境光和漫反射分量设置成我们想要让物体所拥有的颜色,而将镜面分量设置为一个中等亮度的颜色,并设置反光度为32。

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

demo下载:点击跳转

运行效果:

觉得有帮助的话,打赏一下呗。。

           


http://www.ppmy.cn/ops/38395.html

相关文章

vue的计算属性

Vue的计算属性(Computed Properties)是一种更加强大的数据绑定方式,它允许你定义依赖于其他数据属性的计算属性。计算属性是基于它们的依赖进行缓存的,只有相关依赖发生改变时才会重新求值。这意味着只要计算属性依赖的响应式属性…

详解基于 RAG 的 txt2sql 全过程

前文 本文使用通义千问大模型和 ChromaDB 向量数据库来实现一个完整的 text2sql 的项目,并基于实际的业务进行效果的展示。 准备 在进行项目之前需要准备下面主要的内容: python 环境通义千问 qwen-max 模型的 api-keyChromaDB 向量数据库acge_text_…

PHP不良事件报告系统源码vue+element+laravel8 前后端分离 仓储模式开发 AEMS系统源码

PHP不良事件报告系统源码 前后端分离vueelementlaravel8 仓储模式开发 AEMS系统源码 本套医院安全(不良)事件管理系统通过规范事件上报、流转审批、数据统计、原因分析、措施制定、效果追踪的业务流程,全面覆盖医院所有科室,利用统…

243 基于matlab的模糊C均值算法(FCM)及其改进算法将空间邻域项引入FCM的目标函数(FCM_S)

基于matlab的模糊C均值算法(FCM)及其改进算法将空间邻域项引入FCM的目标函数(FCM_S),广义的模糊C均值(GFCM)算法,基于核的改进的模糊c均值聚类算法(KFCM),基于核的广义模糊c均值聚类算法KGFCM的图像分割方法。程序已调…

wordpress外贸网站建设主机选择的注意事项

在为WordPress外贸网站建设选择主机时,您需要注意以下几点: 服务器地理位置: 选择一个靠近目标客户群的服务器位置,这将有助于提高网站的加载速度和可靠性。通常,如果您的目标客户群是国外用户,建议选择美…

随机梯度下降SGD的理解和现象分析

提出问题:令人疑惑的损失值 在某次瞎炼丹的过程中,出现了如下令人疑惑的损失值变化图像: 嗯,看起来还挺工整,来看看前10轮打印的具体损失值变化: | epoch 1 | iter 5 / 10 | time 1[s] | loss 2.3137 |…

Linux连接IP SAN存储配置

Linux通过iSCSI协议挂载IPSAN存储,需要安装iSCSI客户端和Multipath多路径软件。 安装配置iSCSI 1.安装iscsi yum -y install iscsi* 或rpm -ivh iscsi-initiator-utils-6.2.0.871-0.16.e15.i386.rpm 2.开启服务 systemctl start iscsi systemctl enable iscs…

鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽

进程间为何要通讯 ? 鸿蒙内核默认支持 64个进程和128个任务,由进程池和任务池统一管理.内核设计尽量不去打扰它们,让各自过好各自的日子, 但大家毕竟在一口锅里吃饭, 不可能不与外界联系, 联系就得有渠道&#xff0c…