GAMES101学习笔记(三):Rasterization 光栅化(三角形的离散化、抗锯齿、深度测试)

文章目录

  • 视口变换 Viewport
  • 三角形网格 Triangle Mesh
  • 采样 Sampling
  • 走样/反走样 Aliasing/Antialiasing
  • 采样频率、空间域与频率域
  • 深入理解采样、走样、反走样
  • 反走样总结
  • 深度测试 Depth testing


课程资源:GAMES101-现代计算机图形学入门-闫令琪

Lec5 ~ Lec6 学习笔记:
Lecture 05 :Rasterization 1 (Triangles) ——光栅化(三角形的离散化)
Lecture 06 :Rasterization 2 (Antialiasing and Z-Buffering) ——光栅化(抗锯齿和深度测试)

视口变换 Viewport

在变换的章节,我们了解了MVP变换(即Model、View、Projection Transformation),也可以称为观测(Viewing)矩阵变换;
也了解了通过投影变换将三维空间中的物体投影到二维平面:

  • 正交投影:忽略深度信息,相当于将相机放在无限远
  • 透视投影:考虑相机位置,近大远小

下一步,我们将通过视口变换(Viewport Transformation)将投影变换出来的结果显示在屏幕上。
在这里插入图片描述
在这里插入图片描述
这将产生3个问题:

  • 何为屏幕?
    图形学中,认为屏幕是一个二维数组,数组的每一个元素为一个像素。
    这个数组的大小即为分辨率,例如1280*720,表示这个屏幕的分辨率为720p。
    屏幕是一种典型的光栅成像设备。
  • 何为光栅?
    Raster即德语中的屏幕。
    Rasterize光栅化的过程就是将东西画在屏幕上的过程。
  • 何为像素?
    在这门课中我们暂时认为像素是一个小方块,内部的颜色是一个混合的颜色,颜色值用RGB表示。

在这里插入图片描述

通常我们将屏幕左下角设定为屏幕空间原点(0, 0)
屏幕空间坐标为整数,范围从(0, 0)(width-1, height-1)
像素(x, y)中心在(x+0.5, y+0.5)

然后我们暂时忽略Z坐标,通过视口变换矩阵转换到屏幕空间坐标。
视口变换后,我们要把这些多边形显示在光栅显示设备上。

常见的光栅显示设备:

  • 示波器Oscilloscope (阴极射线管CRT, Cathode Ray Tube)
  • LCD显示器(Liquid Crystal Display,液晶显示器)
  • LED显示器(Light-Emitting Diode,发光二极管)
  • OLED显示器(Organic Light-Emitting Diode,有机发光二极管)
  • Electrophoretic(Electronic ink)Display

三角形网格 Triangle Mesh

Triangle - Fundamental Shape Primitives
为什么三角形是最基础的图元:

  • 三角形最基础的多边形(most basic polygon),其他多边形都可以分解为多个三角形。
  • 三点共面 Guaranteed to be planar
  • 三角形的内外定义清晰,可以用叉乘判断内外 Well-defined interior
  • 三角形内可以定义明确的插值方法 Well-defined method for interpolating values at vertices over triangle(barycentric interpolation)

通过判断像素的中心点和三角形的位置关系,可以实现最简单的光栅化。

采样 Sampling

在这里插入图片描述
采样就是将一个函数 离散化 的过程。

通过对像素中心是否在三角形内进行采样,我们就可以对三角形进行光栅化。
如何判断像素中心和三角形的位置关系?通过叉积
在这里插入图片描述
对于边界上的点,我们不做处理。实际上我们定义一个标准,统一处理就好。
我们也没有必要采样所有像素,可以定义Bounding Box在小范围采样。(除此之外也有多种加速采样的方法

轴向包围盒AABB,Axis-aligned bounding box

以上只是最简单的一种光栅化的理论,实际屏幕的光栅化要复杂的多。
但GAMES101中我们还是认为每个像素是一个简单的颜色均匀的小方块。
在这里插入图片描述

走样/反走样 Aliasing/Antialiasing

我们对三角形的采样与原三角形的显示效果有较大的差异
具体来说,边缘多了很多锯齿Jaggie现象,这种现象的学名叫做走样(Aliasing)
解决这种现象的过程就叫做反走样,也叫做抗锯齿(Antialiasing)在这里插入图片描述
在了解反走样之前,我们要重新认识一下 采样 的理论

Sampling is Ubiquitous in Computer Graphics

采样在计算机图形学中应用的非常普遍。

  • 光栅化即对二维点的采样(Rasterization = Sample 2D Positions)
  • 摄影即对相机传感器感光元件的采样(Photograph = Sample Image Sensor Plane)
  • 视频或动画即对时间的采样(Video = Sample time)

Sampling Artifacts(Errors/Mistakes/Inaccuracier) in Computer Graphics

采样广泛存在,采样产生的问题/瑕疵同样广泛存在

  • 锯齿/走样
  • 摩尔纹 Moire Patterns in Imaging
    跳过奇/偶数行和列产生的问题
  • 车轮错觉 Wagon Wheel Illusion
    人眼在时间上的采样跟不上运动速度

产生这些问题的本质
信号变换速度太快,但采样速度太慢。
Signals are changing too fast (high frequency), but sampled too slowly.


我们先介绍一个反走样的解决方法,再详细探究其原理:

先对图像做模糊(blur / pre-filter),再对模糊后的图像采样。
顺序不能反,采样之后再模糊并不能起到反走样的作用。
在这里插入图片描述

采样频率、空间域与频率域

在这里插入图片描述

傅里叶级数展开:任何一个周期函数,都可以写成正弦函数和余弦函数的组合

在这里插入图片描述

信号处理中:

  • 时间域(Time Domain)是描述数学函数或物理信号对时间的关系。是真实世界,是唯一实际存在的域。
  • 频率域(Frequency Domain)是描述信号在频率方面特性时用到的一种坐标系。它不是真实的,而是一个数学构造。

图像处理中:

  • 空间域(Spatial Domain)即图像空间,以图像左上为原点,横为y竖为x的二维平面。
  • 变换域/频率域(Transform/Frequency domain)通过各种数学变换(如傅里叶变换、离散余弦变换、小波变换等)将图像从空间域转换到频率域或其他变换域。在变换域中,图像的特征以频率的形式表示,这使得某些类型的处理(如去除噪声、增强特定频率成分)变得更加高效和直观‌。例如,通过傅里叶变换将图像转换到频率域进行滤波处理后,再转换回空间域,可以得到滤波后的图像‌

通过傅里叶变换可以图像从空间域转换到频率域。
在相同的采样频率下,我们可以看到信号频率越高,频域中高频信号丢失的现象越严重

在这里插入图片描述

上文提到反走样的一个方法是模糊,也就是滤波Filtering。如何在频域理解滤波?
想要详细深入了解各种滤波的细节,需要移步数字图像处理相关课程。
不过在现代项目中,图像处理一般都由深度学习来完成了。

一个方面:
Filtering = Getting rid of certain frequency contents
滤波就是去掉一部分频率信息

另一个方面:
Filtering = Convolution(= Averaging)
滤波即卷积,也即平均

Convolution Theorem
卷积定理
Convolution in the spatial domain is equal to multiplication in the frequency domain, and vice versa.
空域/时域上的卷积 相当于 频域中的乘积;频域上的乘积 也相当于 空域/时域上的卷积。

在这里插入图片描述
用更大的卷积核只能留下更小的频率

深入理解采样、走样、反走样

采样 = 重复一个原始信号的频谱
在这里插入图片描述


如下图现象,我们可以从另一个层面定义走样:
同样的采样方法,采样不同的两种函数,我们无法区分它,这种现象叫做走样。
在这里插入图片描述

关于计算机图形学中的走样现象
光栅化的图形显示器用离散量来表示连续量,因为其中采样的频率并不满足Nyquist采样定理引起的信息失真,是形成图片具有锯齿状或者阶梯状的主要原因,为了消除走样而产生的技术被称为反走样技术。
如上图,黑色低频信号和蓝色高频信号得到一致的采样点,蓝色信号采样不足时,就会可能和黑色信号一样,造成严重走样现象。

香农采样定理,又称奈奎斯特采样定理,是信息论,特别是通讯与信号处理学科中的一个重要基本结论。
Nyquist采样定理:为了不失真地恢复模拟信号,采样频率应该大于模拟信号频谱中最高频率的2倍。

在这里插入图片描述
走样 = 频域上是出现了频谱的混叠
采样不够快,f就越小,频谱在复制粘贴的时候发成了重叠,导致走样的问题

时域上的走样失真,在频域上是出现了频谱的混叠;而图形学上的渲染,实际上是对连续函数(图像中的几何关系,着色参数,以及着色方程等)在空间内进行离散的采样,而这个函数包含的频率范围是无限的,意味着不论用多大的采样频率都无法完美恢复原始信号(图形分辨率有限),所以会造成频谱的混叠,形成走样。这个无法避免,所以在图形渲染中能做的是利用各种技术去减轻走样


回到我们一开始说的反走样方法:先做模糊(滤波),再进行采样。
在这里插入图片描述

  • 反走样/抗锯齿操作流程:(消除混叠)
    • 滤波/模糊,砍掉高频信号
    • 再以稀疏的采样率采样
  • 如何重新理解滤波/模糊操作?
    模糊操作 = 用低通滤波器做卷积
  • 如何在采样时处理模糊?
    超采样MSAA(MultiSampling Anti-Aliasing)
    对每个像素,根据三角形覆盖面积重新计算灰度均值。

反走样总结

总的来说,造成图形学上的走样原因包括两种:

  • 几何走样:在图形渲染管线的光栅化过程中,对连续图元进行采样得到离散的片元的过程,也就是几何走样产生的过程。理想的几何图形中的点线是没有宽度的,而光栅化后在显示器上的像素点有了大小,出现阶梯和边缘锯齿状的现象。
  • 着色走样:发生在对渲染方程的采样不足,比如纹理映射过程中,是从纹理坐标映射到多边形或者曲面上,再映射到屏幕。从纹理的单个纹素对应到屏幕上时,引起的放大缩小,纹素的多余或者缺少,会造成走样着色时在空间变化较快的高频部分采样不足也会形成走样,形成图像闪烁或者噪点(高光部分的噪点)。

图形学中的走样包括 几何走样着色走样,这些走样引起的锯齿和闪烁现象对图形的显示质量有很大的影响,给人观感不佳,这与人们对高质量和高真实感图像的追求相悖,所以高效高性能的反走样算法也一直是计算机图形学的研究与应用热点之一。

相对来说人眼对几何走样的敏感度更高,所以一般提到反走样技术也大多是几何方面的反走样,但随着硬件的发展和人们对画质要求的提高,也有许多算法用于解决着色反走样,两类算法的解决思路也往往差别很大。

在反走样算法的发展过程中出现了不同形式的算法,并且近年来随着深度学习的发展,也助推了反走样算法的研究。

  • 基于超采样的方法(SSAA、MSAA 等)
  • 基于形态学的方法(MLAA、SMAA、FXAA 等)
  • 基于时间的方法(TAA 等)

超分辨率 / 超采样 Super resolution / Super sampling

  • 从低分辨率到高分辨率
  • 需要解决样本不足的问题
  • 解决方案:DLSS(Deep Learning Super Sampling)
    即由AI预测样本不足的部分

深度测试 Depth testing

复杂三维物体在光栅化的过程中,还要解决一个复杂问题:

  • Visibility / occlusion
    可见性 / 遮挡问题

画家算法 Painter’s Algorithm
根据绘画的逻辑,先画远处的物体,再画近处的物体,近处物体可以遮挡住远处物体。
简单场景中,画家算法可以根据正确的排序画出正确的场景。
但在复杂场景下,例如循环遮挡的环状场景下,画家算法就无法画出正确的场景。

实际计算机图形学中的解决方法是引入深度缓存Z-buffer

渲染每帧图像时,同时生成深度图。深度值存储在每个片段里面(作为片段的z值),当片段想要输出它的颜色时,我们会将它的深度值和z缓冲进行比较,如果当前的片段在其它片段之后,它将会被丢弃,否则将会覆盖。

对N个三角形,Z-buffer算法复杂度是O(n)。它不涉及排序,只保存最小的深度值。

Z-buffer算法的结果与三角形进入顺序无关。

在这里插入图片描述

这个过程称为深度测试(Depth Testing)

Z缓冲无法处理透明物体

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode 扩展Cline、Continue的差别?

Cline和Continue都是VSCode的AI编程插件,它们在功能、用户体验、性能、适用场景以及配置和使用步骤等方面存在一些差别: 一、功能差异 编辑功能 Cline:能够分析项目的文件结构和源代码抽象语法树(AST),通…

鸿蒙打包发布

HarmonyOS应用/元服务发布(打包发布) https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-publish-app-V13?catalogVersionV13 密钥:包含非对称加密中使用的公钥和私钥,存储在密钥库文件中,格式…

晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

sparkRDD教程之必会的题目

1.前期准备 (1)看看上一期的博客,最好跟着上一期的博客把sparkRDD的基本命令给熟练掌握后,再来做这篇文章的任务。 上一期的博客:sparkRDD教程之基本命令-CSDN博客 (2)新建文件task6.scala …

stack和queue专题

文章目录 stack最小栈题目解析代码 栈的压入弹出序列题目解析代码 queue二叉树的层序遍历题目解析代码 stack stack和queue都是空间适配器 最小栈 最小栈的题目链接 题目解析 minst是空就进栈&#xff0c;或者是val < minst.top()就进栈 代码 class MinStack { public:M…

欧拉路径算法

欧拉图&#xff1a; 对于应该连通图G&#xff0c;有&#xff1a; 1欧拉路径&#xff1a;一条路径&#xff0c;它能够不重复地遍历完所有的边&#xff0c;这个性质很像不重复地一笔画完所有边&#xff0c;所以有些涉及到欧拉路径的问题叫做一笔画问题。 2欧拉回路&#xff1a…

【C#设计模式(23)——模板方法模式(Template Method Pattern)】

前言 在抽象类中封装算法的结构&#xff0c;具体的实现步骤由子类定义&#xff0c;从而达到不改变算法结构的&#xff0c;允许子类重定义方法内容。代码 public abstract class Teamplate {public void TeamplateMethod(){Step1();Step2();Step3();}protected abstract void …

MyBatis——XML映射文件

在MyBatis中&#xff0c;既可以通过注解的方式配置SQL语句&#xff0c;也可以通过XML映射文件的方式配置SQL语句。对于简单的SQL语句建议直接通过注解的方式配置SQL语句&#xff1a; Delete("delete from user where id#{id}") Integer deleteById(Integer id);但是…

Mysql--运维篇--安全性(数据库访问控制,最小权限原则,表空间加密,TLS加密,证书签发,SQL注入及防范等)

一、数据库访问控制 MySQL的访问控制是确保数据库安全的关键机制之一。通过合理的用户权限管理和访问控制策略&#xff0c;可以防止未经授权的用户访问、修改或删除敏感数据。 1、MySQL访问控制的工作原理 MySQL使用基于用户的访问控制模型&#xff0c;每个用户都有特定的权…

抽奖滚动功能

代码 <template><div class"box"><video class"video" src"../../assets/video/底层.mp4" loop autoplay muted></video><img class"choujiang" src"../../assets/image/抽奖1.png" alt"&…

【Python】Python之locust压测教程+从0到1demo:基础轻量级压测实战(1)

文章目录 一、什么是Locust二、Locust 架构组成三、实战 Demo准备一个可调用的接口编写一个接口测试用例编写一个性能测试用例执行性能测试用例代码1、通过 Web UI 执行&#xff08;GUI模式&#xff09;2、通过命令行执行&#xff08;非GUI模式&#xff09; 小知识&#xff1a;…

Microsoft

Microsoft Word目录1.目录编号与文字的间距设置2. 目录编号缩进设置 Excel函数MID&#xff08;提取字符&#xff09;CONCAT&#xff08;组合字符串&#xff09;EXACT&#xff08;比较字符串&#xff09; PowerPointwindows 11 恢复右键传统菜单 Word 目录 1.目录编号与文字的…

用 Python 处理 CSV 和 Excel 文件

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

JS后盾人--再一次的走进JS?

程序跑起来与避免延迟 如果你讲JS&#xff0c;你就不可能只讲JS 后盾人说开发就要用VScode&#xff08;确实&#xff0c;Windows和Linux都可以跑&#xff09; 然后就是第一天开发的时候装的那些插件 前端访问流程基本分析 托管到服务器上的东西&#xff0c;谁访问下载到谁的…

Android 调用系统服务接口获取屏幕投影(需要android.uid.system)

媒体投影 借助 Android 5&#xff08;API 级别 21&#xff09;中引入的 android.media.projection API&#xff0c;您可以将设备屏幕中的内容截取为可播放、录制或投屏到其他设备&#xff08;如电视&#xff09;的媒体流。 Android 14&#xff08;API 级别 34&#xff09;引入…

PT8M2102 触控型 8Bit MCU

1. 产品概述 PT8M2102 是一款基于 RISC 内核的 8 位 MTP 单片机&#xff0c;内部集成了电容式触摸感应模块、 TIMER 、 PWM、 LVR 、 LVD 、 WDT 等外设&#xff0c;其主要用作触摸按键开关&#xff0c;广泛适用于触控调光、电子玩具、消 费电子、家用电器等领域&am…

LangGraph 教程:初学者综合指南(2)

工具集成 将工具集成到 LangGraph 聊天机器人中可以显着增强其功能&#xff0c;使其能够按照您喜欢的方式访问和处理信息。 让我们修改上一节中创建的基本聊天机器人&#xff0c;以包含一个可以在网络上搜索信息的工具。我们将使用langchain_中community.tools TavilySearchR…

项目练习:若依管理系统字典功能-Vue前端部分

文章目录 一、情景说明二、若依Vue相关代码及配置1、utils代码2、components组件3、api接口代码4、main.js配置 三、使用方法1、html部分2、js部分 一、情景说明 我们在做web系统的时候&#xff0c;肯定会遇到一些常量选择场景。 比如&#xff0c;性别&#xff1a;男女。 状态…

oracle闪回表

文章目录 闪回表案例1&#xff1a;&#xff08;未清理回收站时的闪回表--成功&#xff09;案例2&#xff08;清理回收站时的闪回表--失败&#xff09;案例3&#xff1a;彻底删除表&#xff08;不经过回收站--失败&#xff09;案例4&#xff1a;闪回表之后重新命名新表总结1、删…

TensorFlow Quantum快速编程(基本篇)

一、TensorFlow Quantum 概述 1.1 简介 TensorFlow Quantum(TFQ)是由 Google 开发的一款具有开创性意义的开源库,它宛如一座桥梁,巧妙地将量子计算与 TensorFlow 强大的机器学习功能紧密融合。在当今科技飞速发展的时代,传统机器学习虽已取得诸多瞩目成就,然而面对日益…