OpenGL 材质

添加一个反光度(Shininess)分量,结合上述的三个颜色,我们就有了全部所需的材质属性了:

复制代码
#version 330 core
struct Material {
    vec3 ambient;    //物体表面颜色
    vec3 diffuse;    //漫反射光照下表面的颜色
    vec3 specular;    //表面上镜面高光的颜色
    float shininess;    //镜面高光的散射/半径
}; 

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

    // 镜面光
    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);
}

这样显示出来的立方体很亮,显得不真实

光源对环境光、漫反射和镜面光分量也分别具有不同的强度,因此光照也有环境光、漫反射和镜面光的强度向量。

复制代码
struct Light {
    vec3 position;

    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};

uniform Light light;

vec3 ambient  = light.ambient * material.ambient;
vec3 diffuse  = light.diffuse * (diff * material.diffuse);
vec3 specular = light.specular * (spec * material.specular);

效果:

相关推荐
汉克老师1 小时前
GESP2026年6月认证C++八级( 第二部分判断题(1-10))精讲
c++·归并排序·dijkstra·二分·互斥·gesp8级·可重复组合
nianniannnn2 小时前
c++复习自存--流、异常处理、多线程与C++工程规范
开发语言·c++
知无不研3 小时前
缺省参数与缺省函数的区别
c++·语法
csdndenglu5 小时前
Easy3D:一个轻量级、易用、高效的C++库,用于处理和渲染3D数据,无复杂要求时可替代VTK
开发语言·c++·图形渲染·3d渲染
^yi5 小时前
【C++】String 类
开发语言·c++
chh5636 小时前
C++--vector
开发语言·c++·学习·算法
zmzb01036 小时前
C++课后习题训练记录Day154
数据结构·c++·算法
殳翰15 小时前
下服务器端开发流程及相关工具介绍(C++)
开发语言·c++
青瓦梦滋16 小时前
协议定制/序列化-反序列化(Linux视角)
linux·服务器·网络·c++
山登绝顶我为峰 3(^v^)320 小时前
C/C++ 交叉编译方法
java·c语言·c++