OpenGL学习笔记

【四十三,光照-材质02设置材质】

2019-12-10  本文已影响0人  Woodlouse

设置材质

在上一节中我们了解了不同的材质对光的的变现是不同的,通过定义一个结构来表示材质对光的敏感性。在这一节中我们将定义的材质应用到程序中。

着色器的开发
顶点着色器可以沿用之前的,修改的是片段着色器。

1. 定义材质属性

//材质属性定义
struct Material {
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float shininess;
};
uniform Material material;

2. 应用材质属性

    // Ambient
    vec3 ambient = lightColor * material.ambient;
    
    // Diffuse
    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(lightPos - FragPos);
    float diff = max(dot(norm, lightDir), 0.0f);
    vec3 diffuse = lightColor * (diff * material.diffuse);
    
    //Specular
    vec3 viewDir = normalize(viewPos - FragPos);
    vec3 reflectDir = reflect(-lightDir, norm);
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
    vec3 speclular = lightColor * (spec * material.specular);
    
    vec3 result = ambient + diffuse + speclular;
    color = vec4(result, 1.0f);

3. 在代码中设置材质属性的值

GLS中的结构体没有什么特别之处,填充结构体时设置结构体中的各个元素的uniform值即可:

    m_pShader->setVec3("material.ambient", 1.0f, 0.5f, 0.31f);
    m_pShader->setVec3("material.diffuse", 1.0f, 0.5f, 0.31f);
    m_pShader->setVec3("material.specular", 0.5f, 0.5f, 0.5f);
    m_pShader->setFloat("material.shininess", 32.0f);

4. 运行效果

应用材质

设置材质代码

上一篇下一篇

猜你喜欢

热点阅读