OpenGL学习笔记

【四十六,光照贴图-01漫反射贴图】

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

漫反射贴图

我们希望通过某种方式对每个原始像素独立设置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));

运行效果

漫反射贴图

漫反射贴图源码

上一篇 下一篇

猜你喜欢

热点阅读