周末没事的学习了光栅化进一步理解, 从底层去学习,遇到问题才会从容不迫, 并同时把这些知识分享给大家, 如果大家没时间看视频的话,废话不多说, 直接开始吧, 这里先做一个概念的铺垫在3D即将渲染到我们屏幕当中来的时候。而接下来我们要做的是把这个标准立方体绘制到屏幕上,这样才能最终被我们所看见。
不清楚的同学看下这篇文章吧 [可视化入门跳转到坐标系转换那里]
我们简单看下这张图:
变换过程
而光栅化的过程发生在哪里 ,其实 就是物体通过MVP变换,把摄像机观测的空间压缩成了一个标准立方体。然后将标准的立方体【-,1,】绘制到屏幕上的这些过程
转换
在做这步操作之前,我们首先要知道如下一些定义:
在图形学中,我们把屏幕抽象为一个二维数组,数组中的每个元素称之为像素(pixel,picture element的缩写)。这个数组的大小,就是屏幕的分辨率(Resolution),例如我们常说的屏幕分辨率为1920*1080,就是说有这么些个像素。屏幕是一个典型的光栅成像设备(Raster display)。
示波器(Oscilloscope),阴极射线管(Cathode Ray Tube,早期的显示器),液晶显示器(Liquid Crystal Display,LCD,利用了光的波动性,液晶的扭曲),发光二极管(Light Emitting Diode,LED),墨水屏(Electrophoretic Display,刷新率很低)。
设备
「光栅」(Raster)在德语中就是屏幕的意思,「光栅化」(Rasterize)就是把东西画在屏幕上的过程。这个过程非常的复杂,也是本文的重点,会在后面进行介绍。
像素,最小单位,我们可以把它理解为一个个小方块,像素内的颜色可以用rgba来定义,一个像素(小方块)内只存在一种颜色。
当然随着科技的发展,像素的内容以及分布也越来越复杂,例如下图为两个手机屏幕的像素分布:
image-20220116153836643
左图的苹果手机屏幕中,一个像素拥有三种颜色。
右图三星手机的这种分布我们称之为Bayer pattern,从中可以发现绿色的点比红蓝更多,这是因为人眼对绿色最敏感,人眼看上去可以更舒服。
在文本中依旧认为每个像素中只存在一种颜色。
前面说了,我们要把标准立方体绘制到屏幕上,那么首先我们要定义一下屏幕空间,然后把标准立方体变换到这个空间上。
定义屏幕空间相当于在屏幕上建立一个坐标系,这里我们以屏幕的左下角为原点,向右为x轴方向,向上是y轴方向(注,定义的方法有很多种,例如我们也可以左上角为原点,在后续的操作中遵循自己的定义即可)。
screen
前面说到屏幕是有一个个像素所组成的,例如我们像素的二维数组为 wh,那么就表示在x轴方向有w列,在y轴方向有h行。这里我们设每个像素的大小为11,那么整个屏幕的大小即为 w*h。如上图,一个个小方块即代表一个像素。
这样我们就可以通过坐标的方式来定义每个像素的位置了,即(x, y),可以当做是图中每个小方块左下角点的坐标。例如坐标(0, 0)就表示屏幕最左下角的那个像素,由于坐标从0开始,因此最右上角的那个像素坐标为(w-1, h-1)。
此外我们说过像素是一个个小方块,那么自然有它的中点(即图中小方块中间的点),因此像素(x, y)的中点即为(x+0.5, y+0.5)。
在前面我们定义好了屏幕空间,那么我们要把MVP变换后的标准立方体绘制到屏幕上,首先要做的就是把其变换到这个w*h的空间上,这个变换我们称之为视口变换。
该变换我们主要分为如下两步:
这个变换矩阵很简单,就不过多推导了,其结果如下:
矩阵
在上面视口变换后,我们的标准立方体虽然变成了一个xy方向和屏幕一样大的空间,但是空间中依旧还是我们的三维物体,例如人,建筑,植物等。前面我们知道屏幕是由一个个像素组成的,也就是说我们通过屏幕看见的二维画面其实都是由无数个像素构成的。因此接下「来我们要做的就是把空间中的那些三维物体全部打散成像素,而这个过程,我们就可以称之为光栅化。」
在生活中我们知道,不管是相机拍照还是人眼看,我们仅仅只能看见物体的表面,因此我们要显示在屏幕上的,也仅仅是这些三维物体的表面。而对于表面,我们可以把它理解成由多个不同平面所组成,例如长方体即是六个长方形所组成的。在图形学中,我们需要把表面分解成无数个不同的小三角形(Triangle),这些三角形像网一样编织在一起,就可以形成任何我们想要的三维物体表面,这些由三角形所构成的表面我们称之为Mesh。例如长方体就是有12个三角形组成,因为一个长方形可以分解成两个三角形。更复杂的物体表面分解可见下面几个示意图:
mesh
为什么选择三角形呢?因为它的优点如下:
三角形是最基础的多边形,任何其他不同的多边形都可以拆成若干个三角形。我们可以通过向量的叉积来判断一个点是在三角形内或者外,但是对于有凹凸的多边形不行。我们可以给定三个顶点不同的属性,在三角形内做出渐变效果,即可根据插值算出三角形内任意一点的属性。
通过上面的解释,我们又把问题进行了简单化,也就是把三维物体光栅化即是把无数个三角形进行光栅化。那么同样由繁化简,我们先来看看如何把一个xy平面上的三角形(忽视z轴)进行光栅化,如下图,背景中的黑色实线所围成的小格子即是我们的像素,灰色虚线为辅助线,方便看像素的中心点:
三角形
首先可以肯定的是,光栅化后,肯定不是像上图那样的显示了。因为前面我们说过一个像素中只会存在一个颜色,而上图明显不符合这个要求,例如我们看下标为(1, 2)的像素点,里面只有一部分是红色的。那么这个像素到底应该是没有颜色还是全部红色呢?「在图形学中,我们定义若一个像素的中心点在三角形的内部,那么这个像素就属于该三角形。例如例子中下标为(2, 2)的像素点,我们可以从图中明确的看出其中心点在三角形内部,那么这个像素就应该全部显示红色。」
当然了,我们肯定不可能通过肉眼来观察是否在三角形内部,因此光栅化过程中很重要的一步便是:判断像素的中心点与三角形的内外关系。这里也就体现了使用三角形的好处**,因为前面我们说了使用叉积的方法可以判断点和三角形的内外关系(原理就不多赘述了,主要是通过叉乘去判断 三个 z轴的方向,方向是否一致,来判断点是不是在三角形内部)**。那么我们就可以定义一个函数用来判断,如下:
bool isInside(t, x, y){}
函数体内即使用叉积来判断,若在三角形内则返回true,不在则返回false。输入的参数 t 代表三角形的信息集合(三个顶点的x,y信息),输入的参数 x 和 y 点的位置信息。
知道了屏幕中任何一个点和三角形的关系后,我们遍历每个像素,取其中心点的x和y带入该函数中即可,而这步操作,我们称之为采样。
这张图可能看的更明显一点:
采样
何为采样?是指从总体中抽取个体或样品的过程。用程序的思维来解释的话,就是给定一个连续的函数,然后我们通过不同的输入来获取函数的值。例如有个函数 ,我们分别求 x = 1,x = 2,x = 3...时y的值。采样即把一个函数给离散化(Discretize)的过程,在图形学中有广泛的应用。
采样频率:采样频率可以理解为抽取样本的间隔,例如上面我们采样的是x = 1,x = 2,x = 3...,间隔为1。如果改成x = 1,x = 3,x = 5... ,间隔为2,那么就代表频率变慢。而改成x = 0.5,x = 1,x = 1.5... ,间隔为0.5,那么就代表频率变快。
应用到我们现在所说的屏幕中的话,我们前面已经把摄像机所观测的空间通过一系列变换,变成了在xy方向上和屏幕一样大的空间了。而这个空间内的可以想象成是由无数个连续的点所组成(忽略z)。而我们的屏幕又由一个个的像素组成,这些像素的中心点对应到空间中的点,就是我们从空间中所有点中所抽取出的样本。那么采样的间隔自然是我们像素的实际物理大小。因此若屏幕大小不变,分辨率越高(即像素越多,像素的中心点物理间隔越小),采样的频率越高。
上面介绍的属于采样二维空间中的位置信息,此外我们还可以采样时间,例如下图,便是采样了不同时间人挥球的动作,进行了显示
img
前面我们说了屏幕是由 width * height 个像素点组成的,因此要采样每个像素的中心点,只需要遍历所有像素,然后将其中心点的x和y带入上面定义好的函数中即可:
for(int x = 0; x < width; x++){
for(int y = 0; y < height; y++){
pixel[x][y] = isInside(t, x + 0.5, y + 0.5);//前面提到像素中心点是像素坐标x,y的值+0.5
}
}
这样我们就可以知道在三角形内的所有像素了,如下图,顶点标记黑色的即为在三角形内的顶点。
test
思考:如果我们修改下上面的代码,改成如下,那是做了什么事情?
for(int x = 0; x < width; x++){
for(int y = 0; y < height; y++){
pixel1[x][y] = isInside(t, x + 0.25, y + 0.25);
pixel2[x][y] = isInside(t, x + 0.25, y + 0.75);
pixel3[x][y] = isInside(t, x + 0.75, y + 0.25);
pixel4[x][y] = isInside(t, x + 0.75, y + 0.75);
}
}
其实很简单,做的就不再是采样每个像素的中心点,而是讲一个像素分成了如下图的四块,然后采样每个像素这四块的中心点。
四个
在上面的采样中,我们需要采样屏幕中所有的像素中心点,但是实际上我们的三角形可能非常的小,就占了几个像素,那么这种做法就会造成很大的性能消耗。因此我们可以使用Bounding Box来缩小我们的采样范围。例如下图,可能在三角形内的像素肯定是在蓝色区域的范围内,而这个蓝色区域我们就称之为Bounding Box。也可称之为轴向的包围盒,即Aixe align bounding box,也就是常说的AABB。
包围盒
因此,给定三角形的三个顶点,我们只需要求出三个顶点的在x轴的最大最小值,在y轴的最大最小值,即可定义出一个Bounding Box,然后只需要在这个Bounding Box中进行采样即可。
for(int x = xmin; x < xmax; x++){
for(int y = ymin; y < ymax; y++){
pixel[x][y] = isInside(t, x + 0.5, y + 0.5);
}
}
这样我们已经可以减少很多的采样了,但是还有些特殊的情况,导致三角形本身依旧不大,但是Bounding Box特别大,例如下图这种情况:
special
针对这种情况,我们也可做特殊处理,例如每行做一个Bounding Box,然后从左到右遍历,如下。
逐行boundingBox
至于怎么判断每行的Bounding Box的左右边界,以及怎么判断这个三角形属于这种特殊情况,等后续的学习再进行补充。
通过上面的知识,我们可以找到屏幕中在三角形内部的像素,接着我们对这些像素进行着色,就可得到如下结果
image-20220116161928711
上图也就是我们单个三角形进行光栅化后的结果,也就是屏幕中真正显示的样子。
很显然,这个效果看着和原本的三角形差距很大,三角形的边缘处都是凹凸不平的,也就是所谓的锯齿。这个等后面我继续学习,并整理一下,敬请关注哦
最后给大家做了一个简单的总结如下面图片所示:
总结
本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/o2HEKqdPM4aVg-7GSc6hpQ
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。