美文网首页OpenGL学习笔记
【四十七,光照贴图-02镜面贴图】

【四十七,光照贴图-02镜面贴图】

作者: Woodlouse | 来源:发表于2019-12-17 23:37 被阅读0次

镜面贴图

在上一节中的效果图中看到specular高光做的不太好,我们的木头材质也出现了高光效果,如果把物体设置specular材质设置为vec3(0.0f)的话,箱子周边的钢铁也没有高光了,我们使用下面的纹理来实现箱子周边钢铁材质的高光:


container2_specular.png

这样,黑色部分和木头材质重叠,得到的高光值为0。

镜面贴图采样

在此,我们要使用到之前学习过的纹理单元,首先我们修改片段着色器的材质属性的高光为一个纹理:

//材质属性定义
struct Material {
    sampler2D diffuse;
    sampler2D specular;
    
    float shininess;
};

//高光的计算
//Specular
    vec3 viewDir = normalize(viewPos - FragPos);
    vec3 reflectDir = reflect(-lightDir, norm);
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
    vec3 speclular = light.specular * spec * vec3(texture(material.specular, TexCoords));

在代码中分配纹理单元:

    //分配纹理单元
    m_pShader->use();
    m_pShader->setInt("material.diffuse", 0);
    m_pShader->setInt("material.specular", 1);

在绘制的时候分别绑定对应的纹理:

// 绑定纹理
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_pTex1->textureId);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_pTex2->textureId);

运行效果:


镜面贴图

镜面贴图代码

相关文章

网友评论

    本文标题:【四十七,光照贴图-02镜面贴图】

    本文链接:https://www.haomeiwen.com/subject/grxynctx.html