计算机图形学-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内存管理框架
🚀返回专栏总目录 文章目录 一、内核态内存分配二、用户态内存分配三、内存篇章更新哪些内容沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起将整个内存管理的体系串起来。 对于内存的分配需求,可能来自内核态,也可能来自用户态。 一、内核态内存分配…...
你的编程能力从什么时候开始突飞猛进?
关于编程能力突飞猛进的原因和如何突破自己,以下是我的建议。 在过去的几年中,编程领域发生了很多变化。新的语言和技术不断涌现,使得程序员们需要不断学习和提高。作为一名程序员,编程能力的提高是非常重要的,有助于…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...