title: OpenGL(11)之材质
date: 2020-07-19 9:00
category: 图形学
tags: opengl
OpenGL(11)之材质
1.概述
现实生活中,每个物体对光产生不同的反应(即物体对光的吸收与反射程度不一致导致的差异性),此中涉及到了物体的反射率、介质、光的入射角等知识相关(有兴趣的可自行查阅相关知识),其中最重要当属物体本身了,不同材料的表面具有不同的反射率。
例如:钢材通常比陶瓷材质的物体显得更加闪闪发亮。如果想在OpenGL中模拟多种类型的物体,
必须为每个物体分别定义一个材质属性。
通过上两章的学习,我们知道指定一个物体的颜色和光的颜色,结合环境光和镜面强度分量,可以用来定义物体的视觉输出。
通过环境光照、漫反射光照、镜面光照以及反光度来定义一个材质颜色,即定义了材质属性:
我们使用一个结构体的形式装载这些类型。
#version 330 core
struct Material{
vec3 ambient;//环境光照分量
vec3 diffuse;//漫反射光照分量
vec3 specular;//镜面光照分量
float shininess;//反光度:影响镜面高光的散射/半径
};
uniform Material material;
上述代码片段发生在片段着色器中,我们通过创建一个结构体来存储物体的材质属性,
当然我们可以将其存储为独立的uniform
值,用一个结构体来存储(符合面向对象的思想),条理清晰。
通过上述四个元素来定义一个物体的材质,通过其能够模拟很多现实世界中的材质,以下就是几种现实世界的材质对立方体的影响。
可以看出,通过正确的指定一个物体的材质属性,对于这个物体的感知也会不同,效果显而易见,为一个物体赋予一款合适的材质是非常困难的,由于不合适的材质可能会毁了物体的视觉质量。接下来看看如何为一个物体设置材质吧。
2.设置材质
在上述过程中,已经为片段着色器创建了一个材质结构体的uniform,因此我们可以从uniform变量material中访问这些属性,从而达到修改光照的计算以便顺应新的材质属性。
void main(){
//环境光
vec3 ambient = lightColor * material.ambient;
//漫反射
vec3 normal = normalize(Normal); //标准化的法向量
vec3 lightDirection = normalize(lightPos - FragPos); //光的方向向量
float diff = max(dot(normal,lightDirection)