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

效果:

相关推荐
REDcker9 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
basketball6169 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
想唱rap10 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
落羽的落羽11 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
goodesocket11 小时前
芯片HAST测试:通电工作下如何精准模拟极端环境挑战?
c++
特种加菲猫12 小时前
从零开始手撕AVL树:详解插入、平衡因子更新与四种旋转
开发语言·c++
萑澈12 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
江屿风13 小时前
C++OJ题经验总结(竞赛)1
开发语言·c++·笔记·算法
运筹vivo@13 小时前
LeetCode 2405. 子字符串的最优划分
c++·算法·leetcode·职场和发展·哈希表
有点。13 小时前
C++(枚举法一练习题)
开发语言·c++·算法