美文网首页OpenGL学习笔记
【四十六,光照贴图-01漫反射贴图】

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

作者: Woodlouse | 来源:发表于2019-12-13 22:49 被阅读0次

    漫反射贴图

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

    运行效果

    漫反射贴图

    漫反射贴图源码

    相关文章

      网友评论

        本文标题:【四十六,光照贴图-01漫反射贴图】

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