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

这样,黑色部分和木头材质重叠,得到的高光值为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);
运行效果:

网友评论