GAMES101-05- Rasterization光栅化

Rasterization光栅化 1(triangle)

补充上一节课Perspective Projection

上一节课提到Frustum,那么我们怎么定义这样一个Frustum呢?

答:其实很简单定义好两个。假设从相机出发,我们摆好相机,使得相机看到的就是这样一个我们给定定义宽度和高度,也就是定义好一个宽高比(Aspect ratio=width/height)的近平面。除外,再定义相机可以看到的角度范围(Field of View)即可。

image-20220307210626107

那么这样定义后,我们可以列出关系式,从而可以自动地转化到定义的正交投影的远近、左右、上下的概念上去:

image-20220307211247809

为什么是|n|?

答:因为n是沿着-z轴方向的。

补充完毕,那么在介绍结束观测变换后,所有物体都在经典立方体中后,这节课就说明接下来应该怎么办?

很显然,接下来就是将立方体呈现在屏幕上。将立方体映[1,1]2射到对应的屏幕空间[0,weight]×[0,height]。(注意此时与z无关)

image-20220307213117623

那么怎么投影到屏幕上呢?

答:首先我们要清楚什么是屏幕。

image-20220307211906154

Rasterization

首先弄清楚一些基本概念:

什么是光栅?

答:可以简单地把光栅等同于屏幕。

什么是光栅化?

答:可以简单地定义为把东西画到屏幕上。

什么是像素?

答:虽然像素是个复杂的概念,但是在这节课中,我们认为像素已经是最小的单位,是一个个内部颜色不会发生变化的小方块。而像素和像素之间的颜色可能不一样,一般颜色都是RGB的组合。

光栅化的过程

答:正如上方所说,我们需要将立方体映[1,1]2射到对应的屏幕空间[0,weight]×[0,height],具体分为两步。第一步,就是把立方体的宽度和高度放大成对应的weight和height,而z不发生改变。第二步,要将屏幕空间的左下角定义在原点处,即立方体放大后的中心移到原点处,所以就可以写成一个简单的变换,即视口变换

image-20220307214036828

而做到这一步还不够,接下来就是把得到的结果,也就是把空间中得到的三角形或者多边形转变成图,也就是打散成像素的过程,就是光栅化

在具体介绍光栅实现过程之前,先介绍一些可以在屏幕上画的设备。

Different raster display

Cathode Ray Tube示波器

image-20220307215103569

Frame Buffer:Memory for a Raster Display

image-20220307215443889

这里简单理解,就是将内存中的一块区域显示在屏幕上。

Flat Panel Displays

这里可以特别关注一下LCD,也就是液晶显示。

image-20220307215701112

LED Array Display

image-20220307215927363

Electrophoretic Display

image-20220307220014614

Rasterizing a triangle

为什么三角形可以看作是基础的形状?

答:一是因为三角形是基础的多边形(复杂的多边形都可以用三角形表示),二是三角形独特的特性(三角形必在一平面内;三角形内外定义清晰;根据三角形内任一点与三角形三顶点的位置关系可以得到一个逐渐的变化)

而对于下图左侧三角形,想要用像素表示,我们需要考虑像素中心点与三角形的位置关系才能确定某个像素应该是什么颜色?

image-20220307220656279

那么怎么考虑像素中心点与三角形的位置关系?

答:这里介绍一个最简单的方法——采样法。采样可以看作确定某值作为输入,将该输入的函数值作为采样结果的输出(即,output[x]=f(x))。

Sampling采样

给一个三角形,判断像素的中心是否在三角形内。也就是定义一个函数inside()如下:
image-20220307221033188

如果像素的中心在三角形内,那么函数输出为1,反之为0。

三角形像素位置呈现如下:

image-20220307221156296

进行处理的过程可以表示成下图代码:

for(int x = 0; x < xmax; ++x)
	for(int y = 0; y < ymax; ++y)
		image[x][y] = inside(tri,x+0.5,y+0.5);//加上0.5表示像素中心位置

怎么判断像素中心在不在三角形内部呢?

答:这就用到前面叉乘判断内外的知识了。

image-20220307222243786

那像代码中将所有像素(x到weight,y到height)走一遍有必要吗?

答:没必要,所以x和y的循环范围可以是三角形三个顶点x和y的max和min。将范围虽小成一个包围三角形的方形。之后再判断像素中心在不在三角形内部,若不在三角形内部就没必要光栅化,如果在三角形内部就光栅化。

最后,我们根据三角形光栅化得到下图:
image-20220307223511066

我们会发现这张图是不太对的,很大一部分原因是出于锯齿的存在。

为什么会有锯齿呢?

答:一部分原因在于像素本身是有一定大小的。另一部分原因是我们的采样率对于信号来说是不够高的,也就是信号走样问题(这部分下节课会详细解释)。

posted @   L-Yeeky  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示