漫反射贴图
我们希望通过某种方式对每个原始像素独立设置diffuse颜色,我们怎么实现呢?
对的:使用纹理。
在光照场景中,通过纹理来呈现一个物体的diffuse颜色,这个做法称做漫反射贴图(Diffuse texture)。
简单说:漫反射就是拿一张纹理,在片段着色器中使用纹理的颜色和漫反射参数计算输出颜色的值
1. 顶点数组定义
顶点数组包含三部分:顶点、法线和纹理坐标;
2. 顶点着色器
在顶点着色器中加入纹理坐标的输入和输出:
layout (location=2) in vec2 texCoords;
out vec2 TexCoords;
void main()
{
...
TexCoords = texCoords;
}
3. 顶点数据绑定
//设置顶点属性
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(3*sizeof(float)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(6*sizeof(float)));
glEnableVertexAttribArray(2);
4. 片段着色器
修改材质的定义,加入纹理对象的定义,去除环境光、漫反射光的属性:
//材质属性定义
struct Material {
sampler2D diffuse;
vec3 specular;
float shininess;
};
uniform Material material;
使用纹理颜色计算环境光照和漫反射光照:
// Diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(light.position - FragPos);
float diff = max(dot(norm, lightDir), 0.0f);
vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
// Ambient
vec3 ambient = light.diffuse * vec3(texture(material.diffuse, TexCoords));
运行效果

网友评论