Games101图形学笔记——光栅化

news2024/11/15 19:52:01

这里写目录标题

  • Rasterization光栅化
    • 屏幕空间
    • 隔行扫描
    • 三角形
    • 采样
      • 采样产生的问题
      • 反走样处理方法:采样前模糊
    • 频率,时域
    • 傅里叶级数展开
      • 傅里叶变换
    • 滤波
      • 高通滤波
      • 低通滤波
    • 卷积
      • 卷积的一些定理
    • 反走样
    • MSAA(Multisample Anti-Aliasing)多重采样抗锯齿

Rasterization光栅化

把三维空间的几何形体显示在屏幕上
在这里插入图片描述
在进行了上节课的操作之后,所有物体都处在了[-1,1]³的立方体中,接下来就要把他画在屏幕上,这一步就叫做光栅化
在做透视投影时候需要将一个四棱梯挤压成正方体,就需要先定义一个视锥(四棱锥)

如何定义视锥?
在这里插入图片描述
从摄像机看向一个地方,我们把它当作近平面,宽和高是可以定义的,所以宽高比就是可以定义的

  • 宽高比 Aspect ratio
  • 可视角度 FOV (垂直角度和水平角度可以互相转换)

通过以上两点即可定义一个视锥
在这里插入图片描述
要把图像投影到屏幕上就需要先定义屏幕,在图形学中,屏幕就认为是一个装了像素的二维数组。如数组大小1920*1080

像素是最小单位,每个像素由RBG构成

屏幕空间

屏幕坐标系如下图
在这里插入图片描述
像素的坐标以左下角为准,如图中蓝色像素坐标为(2,1)

像素的中心为(x+0.5,y+0.5)

继续上节课的话题

如何将[-1,1]³中的东西显示到屏幕上呢?
在这里插入图片描述

  • 暂时忽略z
  • 如果只将[-1,1]²中的东西显示到[0,width] x [0,height],那么就很简单了

做个缩放并平移就可以,这个变换就被称为视口变换
在这里插入图片描述

隔行扫描

在这里插入图片描述

以前的显示设备要成像,都是在屏幕上画很多线,画满整个屏幕就形成了一帧画面

隔行扫描就是说

在第一帧只画1、3、5等奇数线

在第二帧只画2、4、6等偶数线

利用人眼的视觉残留特性,这样人们即发现不了画面的异常,还能使机器工作量减半

如今还有某些视频压缩技术采用了这个思想

(但是隔行扫描会造成严重的画面撕裂,特别是对高速运动的画面来说)

三角形

在这里插入图片描述

  • 为什么光栅化选择了三角形?
  • 三角形是最基本的多边形,没有比三角形边更少的多边形 其他多边形都可以拆分为三角形 三角形必定在一个平面内
  • 容易定义三角形的里外 三角形的三个点定义好后,三角形内任意一点可以通过线性的插值来计算得到(重心坐标的插值方法)

如:定义好三个点的颜色,三角形内任意一点的颜色可以通过三个点的颜色来进行插值计算得到

如何将三角形转化为一个一个的像素?
在这里插入图片描述
简单近似采样

给定一个连续的函数f(x),当x等于1时得到的f(1)就是1的采样

所以采样就是把一个函数离散化的过程

只要有一个定义在屏幕空间的函数,那么我们就能算出来不同像素中心的值是多少

我们要采样的东西就是

给定一个三角形,在像素的中心进行采样,来判断中心是否落在三角形内
在这里插入图片描述
逐像素遍历,判断该像素中心是否在三角形内部,输出到屏幕显示
在这里插入图片描述
但是遍历所有像素开销太大,如下图中白色那一列的像素根本没有碰到三角形,所以只要遍历蓝色区域就可以了

我们知道三角形三个顶点的坐标,有了Xmin,Ymin,Xmax,Ymax就可以得到蓝色的区域

蓝色区域就叫做包围盒(轴向包围盒/BoundingBox/AABB)
在这里插入图片描述
采样完成后,因为每个像素都是最小单位,像素内的颜色必须一样,所以我们会得到这样一副图
在这里插入图片描述

这看起来和初始的三角形差别很大,有一个个的明显锯齿(Jaggies/Aliasing)

采样

把到达光学元件上的光,产生的信息,离散成了像素,对这些像素采样,形成了照片

采样不只发生在位置上还能发生在时间上,对图像在时间上进行采样,形成了视频

采样产生的问题

  • 走样
  • 摩尔纹
  • 车轮效应

原因就是信号的变化太快了,以至于采样的速度跟不上

反走样处理方法:采样前模糊

在这里插入图片描述
不能先采样再模糊!只能先模糊在采样

频率,时域

频域和时域是对信号或系统的两种不同的表示方式。

频域表示是通过分析信号的频率分布来表示信号的方式。在频域中,信号被分解为一系列不同频率的分量,每个分量对应着信号中的一种特定的周期性成分。

时域表示是通过直接分析信号在时间上的变化情况来表示信号的方式。在时域中,信号的变化被直接表示为在时间上的变化,而不是在频率上的变化。
在这里插入图片描述

傅里叶级数展开

任何一个周期性的函数都可以变成一系列正弦/余弦的线性组合和一个常数项
在这里插入图片描述

傅里叶变换

可以把一个函数f(x)通过变化变成F(w),F(w)还能通过逆变换变成f(x)
在这里插入图片描述
对五个不同频率的函数波形进行采样

通过f1(x)、f2(x)的采样点,我们可以大致还原出f1(x)\f2(x)的函数波形

但是从f3(x)开始,还原出的波形和原来的函数有较大出入,越往下越明显

这里就可以理解什么叫采样的频率跟不上信号变化的频率了
在这里插入图片描述
我们对蓝色函数进行采样,得到黑色的函数

但假如原本就有这样一个黑色的函数

我们同时对蓝色和黑色进行采样,两个截然不同的函数,得到的采样结果完全相同

这就被称为走样(Aliases)
在这里插入图片描述

滤波

滤波就是抹掉一些特定的频率

对应的信号如何发生变化

傅里叶变换可以把一个函数从时域变到频域

右边的图像就是左边的照片通过傅里叶变换得到的

右边图像表示的就是有多少信息

中间部分是低频信息,越往外越高频
在这里插入图片描述

高通滤波

在频域空间内完全抹掉低频信号,将结果还原成图像,形成左图

高频的东西在图像上表示的就是图像的边界

为什么高频信息代表着边界?

当某一图像的周围突然发生发生了变化,我们就认为他是边界

比如图中人物的衣服和背景就是由黑色突然变成了灰色

相当于颜色信号突然从黑色变成了灰色,就是出现了高频的变化,即边界
在这里插入图片描述

低通滤波

同理高通滤波,得到模糊的图像
在这里插入图片描述
去除高频和低频,只留一部分
在这里插入图片描述
在这里插入图片描述

卷积

移动窗口(Filter),将窗口中三个数和覆盖信号的三个数做点乘,填到结果中
在这里插入图片描述
在这里插入图片描述
其实就是信号在任意一个地方,在他的周围做了个平均操作

卷积的一些定理

时域的卷积 == 频域的乘积

  • 可以拿到一幅图直接用一个卷积滤波器进行卷积操作
  • 也可以
    1. 先傅里叶变换这幅图,将这幅图变到频域
    2. 将卷积滤波器变到频域上
    3. 将两者相乘,乘完后得到的频域的结果,将其逆傅里叶变换,变到时域上
    在这里插入图片描述

将3*3的滤波器乘1/9是为了不让图像整体的颜色发生变化

如果不乘1/9,那么每个像素就会是原来这个像素周围九个像素的和,图像就会越滤波越明亮了
在这里插入图片描述
在这里插入图片描述
左边一列是时域,右边一列是频域

对a图像进行c的采样,得到e

对应的操作在频域中就是bdf

时域的采样在频域中就就体现为频域信号的复制

(这里老师说左边时域进行乘积=右边频域的卷积,和前文说的不一致,我去查了一下,好像两种说法是相互的,都可以,这里不太懂,但是不影响整体的理解)

为什么会产生走样呢?
采样不同的间隔,会引起频谱不同间隔进行复制,所相交的部分就是走样
在这里插入图片描述

反走样

先对图像做模糊(把高频信息拿掉),再采样

把高频信息砍掉,砍掉虚线方块以外,在以原始采样频率进行采样

这样频域图像就不会发生混叠,也就没有走样了
在这里插入图片描述
对覆盖面积求平均,也就是卷积
在这里插入图片描述

MSAA(Multisample Anti-Aliasing)多重采样抗锯齿

通过更多的样本来近似三角形的覆盖率,并不是提高采样频率
把一个像素划分为几个小点,判断这些小点是否在三角形内,再把结果平均起来,就知道三角形覆盖了这个像素的百分之多少
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
并不是简单的提高了采样的频率,只是用来做第一步模糊,求三角形的覆盖率,平均之后是什么

MSAA解决的其实是对信号的模糊操作

在工业界并不是直接将每个像素平均分了四份,而是采用了一些独特的图形,而且一些边缘的像素还会被复用
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

C++_20_多态

多继承会造成 菱形继承** 使用虚继承来解决 不是给爷爷类加 也不是给子类加 是给父类加 虚基指针和虚基表 多态 概念: 概念: 一个事物的多种形态,简称多态 如: 对象的多态 ​ 张三 ​ 在对象面前 怂 ​ 在朋友面前 谄媚 ​ 在父…

Axure科技感大屏系统设计:智慧农场管理平台

在数字化转型的浪潮中,数据可视化作为连接现实世界与数字世界的桥梁,正以前所未有的速度改变着各行各业的面貌。智慧农业作为现代农业的重要发展方向,其管理平台的数据大屏设计尤为重要,它不仅是农场运营状况的直接展示窗口&#…

3. Python计算水仙花数

Python计算水仙花数 一、什么是水仙花数? 百度答案 二、怎样使用Python计算水仙花数? 这里需要for循环,if判断,需要range()函数,需要知道怎么求个位数,十位数,百位数… 1. For循环 语句结…

【Android Studio】API 29(即Android 10)或更高版本,在程序启动时检查相机权限,并在未获取该权限时请求它

文章目录 1. 在AndroidManifest.xml文件中&#xff0c;声明相机权限&#xff1a;2. 在你的Activity中&#xff08;例如MainActivity&#xff09;测试 1. 在AndroidManifest.xml文件中&#xff0c;声明相机权限&#xff1a; <uses-feature android:name"android.hardwar…

OS:初识操作系统——邂逅与启航

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;实践是检验真理的唯一标准&#xff01;&#xff01;&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 前言 各位uu好&#xff0c;现在我们要开始一个新的篇章——操作…

信息安全:守护数字世界的坚固堡垒

信息安全&#xff1a;守护数字世界的坚固堡垒 一、信息安全的重要性与意义 信息安全在个人、企业和社会层面都具有至关重要的意义。 在个人层面&#xff0c;信息安全保护隐私至关重要。在数字化时代&#xff0c;我们的个人信息如银行账户、社交媒体账户等容易受到威胁。一旦…

【代码随想录训练营第42期 续Day58打卡 - 图论Part8 - Dijkstra算法

目录 一、Dijkstra算法 实现方式 1、使用优先队列&#xff08;最小堆&#xff09; 2、朴素法&#xff08;简单数组&#xff09; 二、经典例题 题目&#xff1a;卡码网 47. 参加科学大会 题目链接 题解&#xff1a;朴素Dijkstra 三、小结 一、Dijkstra算法 刚入门Dijks…

【Git】常见命令(仅笔记)

文章目录 创建/初始化本地仓库添加本地仓库配置项提交文件查看仓库状态回退仓库查看日志分支删除文件暂存工作区代码远程仓库使用 .gitigore 文件让 git 不追踪一些文件标签 创建/初始化本地仓库 git init添加本地仓库配置项 git config -l #以列表形式显示配置项git config …

【免费】CISSP官方习题集第4版

伴随2004年4月CISSP新大纲发布&#xff0c;CISSP官方习题集第4版(OPT v4)已于2024年5月出版&#xff1a; 本人维护的中英对照8个知识域分章节练习已同步更新完成&#xff0c;在保持v3版内容基础上&#xff0c;增补了所有v4新内容&#xff0c;免费供考友们使用&#xff0c;访问方…

Requests-HTML模块怎样安装和使用?

要安装和使用Requests-HTML模块&#xff0c;您可以按照以下步骤进行操作&#xff1a; 打开命令行界面&#xff08;如Windows的命令提示符或Mac的终端&#xff09;。 使用pip命令安装Requests-HTML模块。在命令行中输入以下命令并按回车键执行&#xff1a; pip install request…

mp4文件解析

mp4格式与Annexb格式不同 实际送到GPU中解码数据是 00 00 01 + 编码数据,三个字节标识加解码数据 解析开始: for (uint32_t sampleIndex = 0; sampleIndex < track.sample_count; ++sampleIndex) {//----------------------------------------------------------…

28 线性表 · 栈

目录 一、概念与结构 &#xff08;一&#xff09;概念 1、栈 2、压栈 3、出栈 4、底层实现 二、栈的实现 三、栈的算法题 一、概念与结构 &#xff08;一&#xff09;概念 1、栈 一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除操作。进行数据插…

idea连接数据库大避雷!!!

再跟着黑马学习的时候&#xff0c;用黑马的资料安装的数据库&#xff0c;命令行能正常启动&#xff0c;SQLyog也能正常连接&#xff0c;就是tmd idea连接不了。不论是原始的jdbc,还是其它方式都不行&#xff0c;一直报错&#xff1a; 然后就各种搜&#xff0c;有的说数据库驱动…

【JavaEE初阶】多线程(4)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 线程安全的 第四个原因 代码举例: 分析原因 解决方法 方法1 方法2 wait(等待)和notify(通知) wait和sleep区别 线程安全的 第四个原因 内存可见性,引起的线程安全问…

AI辅助癌症诊断取得了进展

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

服务发现和代理实例的自动更新

1.服务发现的两种方式 StartFindService 方法 这是一个在后台启动的连续 “FindService” 活动&#xff0c;当服务实例的可用性发生变化时&#xff0c;会通过回调通知调用者。 它返回一个FindServiceHandle&#xff0c;可通过调用StopFindService来停止正在进行的监视服务实例…

pwn题目搭建过程中glibc出现问题的解决方案

前言&#xff1a; 在做pwn的堆题时&#xff0c;会遇到不同版本的glibc。为了更好地与远程环境对应&#xff0c;我们可以通过patchelf和glibc-all-in-one来更换程序动态加载时的glibc。简单介绍一下&#xff0c;glibc-all-in-one用来下载需要的glibc包&#xff0c;然后用petche…

【Git】初识Git

本篇文章的环境是在 Ubuntu/Linux 环境下编写的 文章目录 版本控制器Git 基本操作安装 Git创建 Git 本地仓库配置 Git认识工作区、暂存区、版本库添加文件修改文件版本回退撤销修改删除文件 版本控制器 在日常工作和学习中&#xff0c;老板/老师要求我们修改文档&#xff0c;…

Live800:客户服务新纪元,从响应到主动关怀的转型之路

在当今这个快速变化的商业环境中&#xff0c;客户服务已不再是简单的售后响应或问题解决的环节&#xff0c;而是企业赢得市场、构建品牌忠诚度、实现可持续增长的核心驱动力。随着技术的飞速发展和消费者需求的日益多样化&#xff0c;客户服务正步入一个新的纪元——从传统的被…

电脑上如何多开微信软件(多个微信同时使用)

想登录几个就下面这种文件里&#xff0c;复制几行即可&#xff1a; 创建的是以 .bat 文件结尾的txt文件&#xff08;先创建一个txt文本文档&#xff0c;等写好了命令保存后&#xff0c;再把文件的后缀名改为: .bat &#xff09;再保存即可。然后&#xff0c;右键以管理员运行&a…