【OpenGL】五、光照

news2024/11/15 13:22:02

OpenGL Lighting

文章目录

  • OpenGL Lighting
  • 一、 冯氏光照模型(Phong Lighting Model)
    • 环境光(Ambient lighting)
    • 漫反射光照(Diffuse lighting)
    • 漫反射光照(Specular Lighting)
  • 二、 材质(Materials)
    • 光照贴图(Lighting maps)
    • 漫反射贴图和镜面光贴图
    • 法线贴图/位移贴图/反射贴图
  • 三、投光物(Light casters)
    • 平行光(Direct Light)
    • 点光源 (Point Light)
    • 聚光等(Spot Light)
  • 四、多光源(Multiple lights)


一、 冯氏光照模型(Phong Lighting Model)

Phong模型由三种反射光组成,分别是环境光、漫反射光、镜面反射光。


环境光(Ambient lighting)

简单来说就是不可能黑暗的很纯粹,在减少资源开销的情况下,我们使用一个简单的很小的常量环境因子乘以光照颜色。

void main()
{
    float ambientStrength = 0.1;
    vec3 ambient = ambientStrength * lightColor;

    vec3 result = ambient * objectColor;
    FragColor = vec4(result, 1.0);
}
  • 代码中可以看到就是在片元着色器中使用 常量环境因子 * 光照 * 物体颜色 来当做环境光

漫反射光照(Diffuse lighting)

简而言之就是,物体表面不同的点,反射的光强并不一定是一样的。在Phong模型里,光线的入射角和该点的法线越近光强越强。

    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(light.position - FragPos);
	float diff = max(dot(norm, lightDir), 0.0);
	vec3 diffuse = diff * lightColor;
  1. 点积和叉积的常用作用
    1. 点积:求两向量夹角(接近程度);投影
    2. 叉积:判断两个向量的做优;判断一个点是否在里在外;通过两个向量确定一个坐标系
      入射方向是光源指向片元,而不是片元指向光源
      点乘是两个向量的长度与它们夹角余弦的积,所以dot参数顺序不影响

漫反射光照(Specular Lighting)

同上,反射后的光强随着观察者的观察角度而变化
观察者的观察角度和反射向量越近则光强越强

    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);
  • 注意reflect的取反,reflect函数是利用点积来实现的
  • 32次幂,次数越高,光斑越小越集中

二、 材质(Materials)

长话短说,就是物体的自身属性会对光产生不同的反应。

  • ambient(环境光)
  • diffuse(漫反射)
  • specular(高光)
  • shininess(反光度)

主要开始在shader用结构体存储数据


光照贴图(Lighting maps)

我们可以不要把贴图当做一张图,而是一种数据存储方式


漫反射贴图和镜面光贴图

简而言之就是贴图存储了上述的漫反射参数,在片元着色器里对其进行采样赋值。

vec3 ambient  = light.ambient  * vec3(texture(material.diffuse, TexCoords));
vec3 diffuse  = light.diffuse  * diff * vec3(texture(material.diffuse, TexCoords));  
vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
FragColor = vec4(ambient + diffuse + specular, 1.0);

法线贴图/位移贴图/反射贴图

  • 法线贴图:改变法线实现凹凸效果
  • 位移贴图:改变顶点实现凹凸效果
  • 反射贴图:改变法线

用Unity表示效果

在这里插入图片描述


三、投光物(Light casters)

其实就是光源

平行光(Direct Light)

  • 无限远
  • 方向相同
vec3 lightDir = normalize(-light.direction);

定义一个光线方向向量而不是位置向量来模拟一个定向光


点光源 (Point Light)

球形加光强衰减

  • 重点是衰减函数,知道就行,不予赘述。
  • 注意一点,所有光照有关的都是设置被照的物体的shader上
float distance    = length(light.position - FragPos);
float attenuation = 1.0 / (light.constant + light.linear * distance + 
                light.quadratic * (distance * distance));

聚光等(Spot Light)

类似锥形,手电。

  • 判断是否在聚光灯照射内
  • 平滑/软化边缘

四、多光源(Multiple lights)

void main()
{
    // 属性
    vec3 norm = normalize(Normal);
    vec3 viewDir = normalize(viewPos - FragPos);

    // 第一阶段:定向光照
    vec3 result = CalcDirLight(dirLight, norm, viewDir);
    // 第二阶段:点光源
    for(int i = 0; i < NR_POINT_LIGHTS; i++)
        result += CalcPointLight(pointLights[i], norm, FragPos, viewDir);    
    // 第三阶段:聚光
    result += CalcSpotLight(spotLight, norm, FragPos, viewDir);    

    FragColor = vec4(result, 1.0);
}

其实就是分装不同的类型,然后逐一叠加。
但是此处并未考虑前向或者延迟渲染。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JUC并发编程笔记2

省流&#xff1a; 自己笔记&#xff0c;划走~~~~ 缓存更新策略

vue3里面vant组件的标签页使用?

一、绑一个v-model事件 二、让activeName的初始为0也就是默认是显示第一个标签页的下标 三、给标签页下面的东西进行一个判断 想让哪个优先显示就把哪个判断作为初始值存入

【试题040】多个逻辑或例题2

1.题目&#xff1a;设int n0;&#xff0c;执行表达式n ||(n-1) ||(n0)||(n1)||(n2)后n的值是 &#xff1f; 2.代码解析&#xff1a; 逻辑或 || 运算符是一个短路运算符&#xff0c;它从左到右依次计算表达式&#xff0c;如果遇到一个为真&#xff08;非零&#xff09;的值&am…

No171.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

第一章概述

一、学习目的与要求 本章对软件测试作了概括性的介绍&#xff0c;目的是使学生对软件测试有个初步的认识。通过本章的学习&#xff0c;应使学生掌握软件测试的基本概念&#xff0c;了解软件测试的发展历程和行业现状&#xff0c;掌握软件测试技术的分类&#xff0c;理解软件测试…

【JAVA-Day49】Java LinkedList集合详解

Java LinkedList集合详解 摘要引言Java LinkedList集合详解一、什么是LinkedList集合1.1 链表数据结构1.2 双向链表1.3 动态大小1.4 插入和删除元素1.5 适用场景 二、LinkedList集合的使用2.1 创建 LinkedList 集合、添加元素、遍历元素2.2 在指定位置插入元素2.3 获取指定位置…

模拟 Junit 框架

需求 定义若干个方法&#xff0c;只要加了MyTest注解&#xff0c;就可以在启动时被触发执行 分析 定义一个自定义注解MyTest&#xff0c;只能注解方法&#xff0c;存活范围是一直都在定义若干个方法&#xff0c;只要有MyTest注解的方法就能在启动时被触发执行&#xff0c;没有这…

开源博客项目Blog .NET Core源码学习(5:mapster使用浅析)

开源博客项目Blog使用mapster框架映射对象&#xff0c;主要是在数据库表对象及前端数据对象之间进行映射&#xff0c;本文学习并记录项目中mapster的使用方式。   App.Hosting项目的program文件中调用builder.Services.AddMapper函数进行对象模型自动映射&#xff0c;而该函数…

numpy矩阵画框框

在n>5(n是奇数)的nn数组中&#xff0c;用*画外方框和内接菱形。 (本笔记适合熟悉numpy的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那…

二维码智慧门牌管理系统升级解决方案:突破传统,实现质检与抽检的个性化配置

文章目录 前言一、引入“独立质检”二、个性化抽检类别设定三、触发重采要素的功能升级四、升级优势与展望 前言 在数字化时代&#xff0c;智慧门牌管理系统已经成为社会管理的重要工具。为了满足各种复杂需求&#xff0c;系统升级是必然趋势。本次升级主要针对质检和抽检两大…

Python+requests+exce接口自动化测试框架

一、接口自动化测试框架 二、工程目录 三、Excel测试用例设计 四、基础数据base 封装post/get&#xff1a;runmethod.py #!/usr/bin/env python3 # -*-coding:utf-8-*- # __author__: hunterimport requests import jsonclass RunMain:def send_get(self, url, data):res req…

Ragnar Locker勒索软件开发者在法国被逮捕

导语&#xff1a;在一次跨国行动中&#xff0c;执法机构逮捕了与Ragnar Locker勒索软件团伙有关的一名恶意软件开发者&#xff0c;并查封了该团伙的暗网网站。Ragnar Locker勒索软件团伙自2020年以来在全球范围内对168家国际公司进行了攻击。此次行动是法国、捷克、德国、意大利…

搭建网站七牛云CDN加速配置

打开七牛云后台&#xff1b;添加域名&#xff1b; 添加需要加速的域名&#xff0c;比如我添加的是motoshare.cn 源站配置&#xff0c;这里要用IP地址&#xff0c;访问的目录下面要有能访问测试的文件&#xff0c;尽量不要用源站域名&#xff0c;这个只能用加速二级域名&#x…

git版本升级

2.17.1之前执行指令&#xff1a;git update(现在大部分应该都不用这个指令&#xff0c;都高于这个版本) 2.17.1之后执行指令&#xff1a;git update-git-for-windows 可通过git --version查看版本 如图所示 等待安装成功即可

蓝桥杯每日一题2023.10.22

题目描述 灵能传输 - 蓝桥云课 (lanqiao.cn) 题目分析 发现每一次的灵能传输都是对前缀和s[i - 1]和s[i]的一次交换 故为求max(s[i], s[i - 1])的最小值&#xff08;发现当s单调时可以成立&#xff09; 由于s[0]和s[n]的位置不变&#xff0c;但是s[0]和s[n]不一定是最大值或…

使用CMake构建一个简单的C++项目

文章目录 一. 构建一个简单的项目二. 构建过程1. 创建程序源文件2. 编写CMakeList.txt文件3. 构建项目并编译源代码 附件 一. 构建一个简单的项目 最基本的CMake项目是从单个源代码文件构建的可执行文件。对于像这样的简单项目&#xff0c;只需要一个包含三个命令的CMakeLists…

Egg.js项目EJS模块引擎

1.介绍 灵活的视图渲染&#xff1a;使用 egg-view-ejs 插件&#xff0c;你可以轻松地在 Egg.js 项目中使用 EJS 模板引擎进行视图渲染。EJS 是一种简洁、灵活的模板语言&#xff0c;可以帮助你构建动态的 HTML 页面。 内置模板缓存&#xff1a;egg-view-ejs 插件内置了模板缓存…

react 学习 —— 16、使用 ref 操作 DOM

什么时候使用 ref 操作 DOM&#xff1f; 有时你可能需要访问由 React 管理的 DOM 元素 —— 例如&#xff0c;让一个节点获得焦点、滚动到它或测量它的尺寸和位置。在 React 中没有内置的方法来做这些事情&#xff0c;所以你需要一个指向 DOM 节点的 ref 来实现。 怎么使用 r…

蓝桥杯中级题目之组合(c++)

系列文章目录 数位递增数_睡觉觉觉得的博客-CSDN博客拉线开关。_睡觉觉觉得的博客-CSDN博客蓝桥杯中级题目之数字组合&#xff08;c&#xff09;_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入2.输出3.代码示例 总…

系统架构师考试科目一:综合知识

某软件公司欲开发一个 Windows 平台上的公告板系统。在明确用户需求后&#xff0c;该公司的 架构师决定采用 Command 模式实现该系统的界面显示部分&#xff0c;并设计 UML 类图如下 图所示。图中与 Command 模式中的 Invoker 角色相对应的类是( ) &#xff0c;与 ConcreteComm…