计算机图形学-GAMES101-7
引言
场景中有很多的三角形,如果实现可见性和遮挡呢?
一个简单的想法是,从远到近画,近处的物体自然会覆盖掉远处的物体,这种画法也叫画家算法。
但是实际绘制中物体的顺序是不容易确定的,比如如下图绘制一个立方体:

在空间中,两个三角形或者两个面之间的前后关系并不是唯一的,如下图所示:
一、深度缓存Z-Buffer
因此我们不能给空间中的三角形定义前后顺序关系,也因此不能使用画家算法,甚至不能对三角形整体进行绘制。使用什么方案才能实现可见性和遮挡呢?
使用Z-Buffer深度缓存。对于每一个像素,我们记录覆盖它的物体片段的Z值,当循环到一个新的片段时,我们比较新片段Z值和像素处记录的Z值,如果新片段Z值更大即离摄像机更近覆盖了旧片段,则更新像素处的Z值,并将此片段的颜色值赋值给这个像素。
伪代码如下所示,对于每一个三角形中的每一个像素,去计算这个像素是否会被这个三角形的颜色更新。最后就得到了每一个像素处的颜色值。

在现代渲染中,我们使用颜色缓存记录每个像素处的颜色值,我们使用另一个缓存记录每个像素处的最大Z值,这个缓存就叫做深度缓存Z-Buffer。

深度缓存工作流程示意图:

深度缓存的时间复杂度为O(n),因为就是求了个最大值而已。
Z-Buffer无法处理透明物体的深度,透明物体需要特殊处理。
计算机保存和计算浮点数是有误差的,因此基本上两个浮点数永远不会相同。在现实中偶尔会出现深度值相同,比如我们自己定义的地板和人脚的深度值,通常我们都把他们设置为0,这会导致一些不好情况的发生。你可能会有疑问,地板和脚,是高度是y值,怎么是深度呢?我们现在所说的深度是指从游戏中摄像机的方向看去,也就是说坐标系并不是世界坐标系。比如你玩3A游戏时,朝自己的脚看,那脚和地面的前后关系不就是深度Z值决定的吗?这是因为我们现在讨论的深度是在观察坐标中的,即摄像机位于坐标系原点,而摄像机朝向的方向就是Z轴(在本课中为-Z半轴)。
二、Shading引言
(1)我们现在能做的
通过之前的内容,我们可以通过观察矩阵将摄像机和模型转换到标准位置,再通过投影和视口变换将三维空间映射到二维空间,再通过光栅化采样和反走样得到屏幕上每个像素的颜色值。

渲染到此就结束了吗?如果我们止步于此,我们只能得到下图的渲染效果:

(2)我们期望的效果
貌似这并不是我们想要得到的,它看起来并不真实。我们期待看到的应该是这种效果:

这张图看起来更加真实一些,为什么呢?它和第一张图有什么区别吗?仔细看第二张图中的立方体,你会看到它同一个面的颜色有所不同,比如每个立方体的上表面,而第一张图无论何时何地每一个面给我们呈现的颜色都是相同的。注意第二张图每个立方体的左侧面,它是很暗淡的,带给我们一种真实的视觉感。这像是什么呢?阴影!我们想要还原3D真实世界中的效果,就必然要模拟真实世界中的光照、阴影等效果才行。
(3)模拟真实的世界
如下图(渲染的),为什么我们能看到的世界是五彩缤纷的?

三、Shading
什么是着色呢?引入明暗的不同。着色的定义:对不同的物体,应用不同材质的过程。
不同的材质和光线的相互作用不同。
(1)Blinn-Phong反射模型
Blinn-Phong是一个着色模型,它考虑了物体的高光、漫反射、环境光。反射示意图如下:

定义v为观察方向、n为法线方向、I为反射方向,三个向量都是单位向量。
shading≠shadow,即着色不等于也不考虑阴影。对于任意一个片段的着色,我们只考虑片段本身,不考虑其他任何物体的存在。
(2)漫反射Diffuse Reflection
漫反射可以实现物体表面颜色的渐变效果。
一束光从光源发出,到达物体某个点,再经过反射进入我们的眼睛。计算我们看到的颜色,就是计算反射光的强度。
计算反射光的强度,先要考虑反射强度,即入射光有多少被反射了?还要考虑入射光强度,即从光源到反射点,有多少光被衰减了?
(2.1)反射强度
某个地方接收到的光照强度,使用单位面接接收到的光照能量去衡量。如下图所示,物体接收到光的能量与 入射方向和表面法向量间夹角的余弦值 成正比,我们使用这个余弦值去代表反射的强度。

(2.2)入射光的衰减
考虑点光源的能量是发散的,以点光源为球心,不断发散到一个又一个的球壳上。能量是守恒的,即球壳表面能量之和不变,但是随着球壳向外的传播,球壳表面积会增大,导致每一条光线的能量逐渐变小。
理想化的假设光源每时每刻散发出的能量相同为E,则在任意一个时刻t,这些能量E一定均匀散布在一个半径为r的球壳上,则单位面积球壳具有的能量为E/(4πr ^ 2)。任意一个距点光源距离为r的物体,我们可以得知它接收到的能力为E/(4πr ^2),4π为常数,因此我们可以得出:物体接收到光的强度和它距离光源距离的平方成反比(注意这只针对点光源,并且没考虑遮挡)。

(2.3)计算公式
点乘为负表示光线射到的是反面,没有物理意义所以使用MAX函数。
在真实世界中物体是有不同的材质的,物体是会吸收光的能量的,kd就是度量的物体对能量吸收的强弱,称为:漫反射系数。如果kd为0,物体就会吸收所有的光,而不会有光反射处理导致我们看到的都是黑的,比如黑猫效应。kd可以是一个三维向量,分别对应物体对RGB三原色的吸收。

最终实现的渐变效果:

注意漫反射计算公式中没有涉及v即反射方向,因此它代表观察者无论从哪个视角去看,看到物体的效果和颜色都是一样的。这是正确的,因为漫反射就是表现光向四面八方的反射。
在现实中,光是有属性的,即光的颜色值(一个三维向量)。而现实中的物体也是有材质的,比如金属和木头的反射效果就截然不同,因此我们会给物体设置一个材质属性,表示它自身材质对光的相互作用,这里我们介绍了kd表示物体材质对光漫反射强度的一个度量,而材质中还有很多其它的度量。
相关文章:
计算机图形学-GAMES101-7
引言 场景中有很多的三角形,如果实现可见性和遮挡呢? 一个简单的想法是,从远到近画,近处的物体自然会覆盖掉远处的物体,这种画法也叫画家算法。 但是实际绘制中物体的顺序是不容易确定的,比如如下图绘制…...
AndroidAuto 解决PCTS NF7
直接上代码 public void handleNavigationFocusRequest(int focusType) {// Always grant requested focus in this example.-mGal.galReceiver.sendNavigationFocusState(focusType);+mGal.galReceiver.sendNavigationFocusState...
GPT:你知道这五年我怎么过的么?
时间轴 GPT 首先最初版的GPT,来源于论文Improving Language Understanding by Generative Pre-Training(翻译过来就是:使用通用的预训练来提升语言的理解能力)。GPT这个名字其实并没有在论文中提到过,后人将论文名最后…...
Python一行命令搭建HTTP服务器并外网访问 - 内网穿透
文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章:【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…...
TypeScript5-泛型
泛型是 TS 中一个重要的概念,它可以创建可复用的组件,同时保持对类型信息的一致性。 泛型提供了一种方式使得类型可以被参数化,这样就可以创建可以适用于各种数据类型的函数或类,而不仅仅限于一个数据类型。 一、泛型 先来看一…...
IMX6ULL裸机篇之DDR3的时钟配置
一. MMDC 控制器 对于 I.MX6U 来说,有 DDR 内存控制器,否则的话它怎么连接 DDR 呢?MMDC控制器 就是 I.MX6U 的 DDR内存控制器。 MMDC 外设包含一个内核(MMDC_CORE)和 PHY(MMDC_PHY),内核和 PHY 的功能如下: MMDC 内…...
PBDB Data Service:Specimens and measurements(标本和测量)
Specimens and measurements(标本和测量) 描述摘要1. [Single specimen(单个标本)](https://blog.csdn.net/whitedrogen/article/details/130685099)2. [Add specimen records or update existing records(添加标本记录…...
Zookeeper(一)
简介 设计模式角度 Zookeeper:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那…...
Maven(五):Maven的使用——依赖的测试
Maven(五):Maven的使用——依赖的测试 前言一、实验六:测试依赖的范围1、依赖范围1.1 compile 和 test 对比1.2 compile 和 provided 对比1.3 结论 二、实验七:测试依赖的传递性1、依赖的传递性1.1 概念1.2 传递的原则…...
超级独角兽 Databricks 的崛起之路
在数据扩张以及 AI 兴起的时代,数据存储和分析平台拥有巨大价值和能量。 随着互联网数据的爆炸性增长,数据已经成为企业的新型资源,犹如石油般重要。越来越多的企业希望利用各种结构化和非结构化数据来发挥自己的优势。 然而,他…...
python 3.8 + tensorflow 2.4.0 + cuda11.0 的问题
版本匹配 🔗从源代码构建 | TensorFlow 报错:Could not load dynamic library ‘cupti64_110.dll’; dlerror: cupti64_110.dll not found 是因为我电脑中的 cuda 版本以前是 10,现在是 11.4 ,所以需要安装对应版本的 cudatoolk…...
华为杯”研究生数学建模竞赛2021 年中国研究生数学建模竞赛 E 题: 信号干扰下的超宽带(UWB)精确定位问题-参考思路
一、背景 UWB ( Ultra-Wideband )技术也被称之为“超宽带”,又称之为脉冲无线电技术。这是一 种无需任何载波,通过发送纳秒级脉冲而完成数据传输的短距离范围内无线通信技术,并且信 号传输过程中的功耗仅仅有几十 W 。 UWB 因其独有的特点,使其在军事、物联网等各个领…...
Java 中的访问修饰符有什么区别?
Java 中的访问修饰符用于控制类、类的成员变量和方法的访问权限,主要有以下四种: public:公共访问修饰符,可以被任何类访问。public 修饰的类、成员变量和方法可以在任何地方被访问到。 protected:受保护的访问修饰符…...
Go基础篇:接口
目录 前言✨一、什么是接口?二、空接口 interface{}1、eface的定义2、需要注意的问题 三、非空接口1、iface的定义2、itab的定义3、itab缓存 前言✨ 前段时间忙着春招面试,现在也算告一段落,找到一家比较心仪的公司实习,开始慢慢回…...
边缘计算:数字时代的新战场
随着数字化时代的到来,云计算已经成为了各行各业不可或缺的技术支持。但是,由于云计算涉及到数据的传输和存储,对于网络带宽和延迟的要求也非常高,这使得云计算难以满足一些低延迟、高实时性要求的场景。在这种情况下,…...
PBDB Data Service:Fossil occurrences(化石产出记录)
Fossil occurrences(化石产出记录) 描述摘要1. [Single fossil occurrence(单条化石产出记录)](https://blog.csdn.net/whitedrogen/article/details/130519180)2. [List of fossil occurrences(化石产出记录列表&…...
虾皮Shopee商品详情接口(item_get-根据ID取商品详情)代码封装
item_get-根据ID取商品详情接口 通过代码封装该接口可以拿到商品标题,商品价格,商品促销信息,商品优惠价,商品库存,sku属性,商品图片,desc图片,desc描述,sku图片…...
原生js手动实现一个多级树状菜单效果(高度可过渡变化) + 模拟el-menu组件实现(简单版)
文章目录 学习链接效果图代码要点 简单模拟el-menu实现TestTree.vueMenu.vueSubMenu.vue 学习链接 vue实现折叠展开收缩动画 - 自己的链接 elment-ui/plus不定高度容器收缩折叠动画组件 - 自己的链接 vue的过渡与动画理解 Vue transition 折叠类动画自动获取隐藏层高度以及…...
RK3568平台开发系列讲解(Linux内存篇)Linux内存管理框架
🚀返回专栏总目录 文章目录 一、内核态内存分配二、用户态内存分配三、内存篇章更新哪些内容沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起将整个内存管理的体系串起来。 对于内存的分配需求,可能来自内核态,也可能来自用户态。 一、内核态内存分配…...
你的编程能力从什么时候开始突飞猛进?
关于编程能力突飞猛进的原因和如何突破自己,以下是我的建议。 在过去的几年中,编程领域发生了很多变化。新的语言和技术不断涌现,使得程序员们需要不断学习和提高。作为一名程序员,编程能力的提高是非常重要的,有助于…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
