LearnOpenGL笔记——二、光照:“颜色”、“基础光照”和“材质”

这篇博客探讨了OpenGL中的颜色表示和光照模型,包括RGB颜色系统、冯氏光照模型和Gouraud着色。通过示例代码解释了漫反射光照、镜面光照的计算,并分析了Gouraud着色可能导致的视觉问题。同时,介绍了材质的概念以及如何通过调整光的属性来影响物体表面的外观。
摘要由CSDN通过智能技术生成

二、光照:“颜色”、“基础光照”和“材质”

2.1 颜色

  • 颜色可以数字化的由红色(Red)、绿色(Green)和蓝色(Blue)三个分量组成,它们通常被缩写为RGB。仅仅用这三个值就可以组合出任意一种颜色。例如,要获取一个珊瑚红(Coral)色的话,我们可以定义这样的一个颜色向量:

    glm::vec3 coral(1.0f, 0.5f, 0.31f);
    
  • 我们将光源设置为白色。当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色(也就是我们所感知到的颜色)

    glm::vec3 lightColor(1.0f, 1.0f, 1.0f);
    glm::vec3 toyColor(1.0f, 0.5f, 0.31f);
    glm::vec3 result = lightColor * toyColor; // = (1.0f, 0.5f, 0.31f);
    
    • 如果我们使用绿色的光源又会发生什么呢?
    glm::vec3 lightColor(0.0f, 1.0f, 0.0f);
    glm::vec3 toyColor(1.0f, 0.5f, 0.31f);
    glm::vec3 result = lightColor * toyColor; // = (0.0f, 0.5f, 0.0f);
    
  • 创建一个光照场景——略

2.2 基础光照

  • 冯氏光照模型(Phong Lighting Model)
    • 环境光照
    • 漫反射光照
    • 镜面光照
  • 为了计算漫反射光照镜面光照,需要传入面法向量的数据
  • 完整像素着色器代码:
    # version 330 core
    out vec4 FragColor;
    
    in vec3 Normal;
    in vec3 FragPos;
    
    uniform vec3 objectColor;
    uniform vec3 lightColor;
    uniform vec3 lightPos;
    uniform vec3 viewPos;
    
    void main()
    {
        // 环境光
        float ambientStrength = 0.1;
        vec3 ambient = ambientStrength * lightColor;
    
        // 把法线和最终的方向向量都进行标准化
        vec3 norm = normalize(Normal);
        vec3 lightDir = normalize(lightPos - FragPos);
    
        // 对norm和lightDir向量进行点乘,计算光源对当前片段实际的漫发射影响
        float diff = max(dot(norm, lightDir), 0.0);
        vec3 diffuse = diff * lightColor;
    
        // 定义一个镜面强度(Specular Intensity)变量,给镜面高光一个中等亮度颜色,让它不要产生过度的影响
        float specularStrength = 0.5;
    
        // 计算视线方向向量,和对应的沿着法线轴的反射向量
        vec3 viewDir = normalize(viewPos - FragPos);
        vec3 reflectDir = reflect(-lightDir, norm);
    
        // 计算镜面分量
        float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
        vec3 specular = specularStrength * spec * lightColor;
    
        // 计算和
        vec3 result = (ambient + diffuse + specular) * objectColor;
        FragColor = vec4(result, 1.0);
    }
    

在这里插入图片描述
在这里插入图片描述

  • Gouraud着色的问题:
    • 您可以看到(您自己或在提供的图像中)立方体前面两个三角形的清晰区别。这种“条纹”是可见的,因为片段插值。从示例图像中,我们可以看到立方体正面的右上角顶点被高光照亮。由于右下三角形的右上角顶点是亮的,而三角形的其他两个顶点不是,所以亮的值插入到另外两个顶点。左上角的三角形也是如此。由于中间像素的颜色不是直接来自光源,而是插值的结果,所以中间像素的照明是不正确的,左上角和右下角的三角形在亮度上发生碰撞,导致两个三角形之间出现可见的条纹。
    • 当使用更复杂的形状时,这种效果会更加明显。

2.3 材质

  • 材质
    在这里插入图片描述
    在这里插入图片描述
  • 光的属性
    在这里插入图片描述
    • 完整像素着色器代码:
    #version 330 core
    out vec4 FragColor;
    
    struct Material {
        vec3 ambient;
        vec3 diffuse;
        vec3 specular;    
        float shininess;
    }; 
    
    struct Light {
        vec3 position;
    
        vec3 ambient;
        vec3 diffuse;
        vec3 specular;
    };
    
    in vec3 FragPos;  
    in vec3 Normal;  
      
    uniform vec3 viewPos;
    uniform Material material;
    uniform Light light;
    
    void main()
    {
        // ambient
        vec3 ambient = light.ambient * material.ambient;
      	
        // diffuse 
        vec3 norm = normalize(Normal);
        vec3 lightDir = normalize(light.position - FragPos);
        float diff = max(dot(norm, lightDir), 0.0);
        vec3 diffuse = light.diffuse * (diff * material.diffuse);
        
        // specular
        vec3 viewDir = normalize(viewPos - FragPos);
        vec3 reflectDir = reflect(-lightDir, norm);  
        float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
        vec3 specular = light.specular * (spec * material.specular);  
            
        vec3 result = ambient + diffuse + specular;
        FragColor = vec4(result, 1.0);
    } 
    
  • 练习:绿宝石
    在这里插入图片描述
cda备考学习学习笔记——基础知识篇()主要涉及了计算机科学与技术领域的基本概念和知识。 首先,它介绍了计算机网络的基础知识。网络是将多台计算机通过通信链路连接起来,使它们能够相互通信和共享资源的系统。笔记中详细介绍了网络的组成、拓扑结构和通信协议等重要内容。 其次,笔记还解释了计算机系统的基本组成。计算机系统由硬件和软件两部分组成,其中硬件包括中央处理器、存储器、输入输出设备等,而软件则分为系统软件和应用软件。笔记详细介绍了各种硬件和软件的功能和作用。 此外,笔记还对数据库管理系统进行了介绍。数据库管理系统是一种用于管理和组织数据的软件系统,它能够实现数据的存储、检索和更新等操作。笔记中详细介绍了数据库的概念、结构和操作等内容。 最后,笔记还包括了算法和数据结构的基础知识。算法是解决问题的一系列步骤和规则,而数据结构则是组织和存储数据的方式。笔记中介绍了常用的算法和数据结构,如排序算法、树和图等。 总之,通过学习CDA备考学习笔记中的基础知识篇(),我们能够更好地理解计算机网络、计算机系统、数据库管理系统以及算法和数据结构等相关概念和知识。这些基础知识对于我们深入研究计算机科学与技术领域是非常重要的,也为我们日后的学习和工作奠定了坚实的基础
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值