GAMES101 学习5——光栅化(三角形的离散化)

举报
lutianfei 发表于 2022/05/03 18:02:26 2022/05/03
【摘要】 参考资料:https://www.yuque.com/sugelameiyoudi-jadcc/okgm7e/7d79f2ac5a59f11721065370e5415070https://blog.csdn.net/qq_36242312/article/details/105695242 一、一些准备工作1.Define a “fov”(视锥)只需要定义:垂直的可视视角 和 ...

参考资料:

image.png

一、一些准备工作

术语说明:

  • Raster(光栅): 即德语中的Screen, 动词化Rasterize=drawing onto screen
  • Pixel(像素): Picture element的缩写
    image.png

1.1 视锥定义(Define a fov)

只需要定义:垂直的可视视角宽高比 (其他的正交变换之类都可推导出)

image.png

image.png

fovY表示视野角度,同时已知近平面深度为n,远平面深度为f,宽高比为aspect,所以可以通过相似三角形和角度关系求得:
tan f o v Y 2 = t n \tan \frac{f o v Y}{2}=\frac{t}{|n|}

aspect = r t r = a s p e c t t \text {aspect}=\frac{r}{t} → r= {aspect} \cdot {t}

即构建透视矩阵需要视野角度fov,宽高比,znear, zfar四个参数。

1.2 视口变换

M(model),V(view),P(projection)变换之后,我们已经得到了三维坐标在二维屏幕上的投影,同时也得到了投影区域(Canonical Cube)。之后所需要的就是视口变换。视口变换是把三维坐标与屏幕上指定的区域进行映射,简单来说就是我们在屏幕上规定了一块区域,然后将我们投影的坐标规定好,只能画在这块区域中,这就是视口变换所做的事情。

1.3 定义屏幕空间

既然要找到这个映射关系,那么屏幕自身也应该有自己的坐标系,也就是屏幕空间。我们可以把屏幕上的像素看成是像素的矩阵形式,认为屏幕左下角是原点,向右是x,向上是y,里面每一个坐标都可以看做包含了一个像素。

一些规定:

  • Pixel’s indices(像素坐标)是(x,y)的形式;x,y都是整数(integers)
  • 所有的像素的表示(0,0)to(width-1,height-1)
  • 像素的中心:(x+0.5,y+0.5)
  • 整个屏幕覆盖(0,0)to(width,height)
    image.png

1.4 屏幕空间的标准化

这一步需要把Canonical Cube [ 1 , 1 ] 2 ∈[-1,1]^{2} 变换到 [ 0 ,  width  ] × [ 0 ,  height  ] [0, \text { width }] \times[0, \text { height }] ,width和height就是视口变换所需要规定的区域的长和宽。

这一步变换可以看成是二维平面上矩阵的平移和缩放,故有以下视口变换公式:
image.png

二、光栅化

Rasterization -> Draw to Raster Displays

2.1 为什么选择三角形?

  1. 基础图元:三角形可以看成是基础图元,用它可以构建出不同的图元
  2. 平面:一个三角形必定是一个平面
  3. 内外定义:三角形是可以通过顶点环绕顺序来描述其内外性的,方便做面剔除等操作
  4. 便于插值:三角形内部插值十分方便

2.2 如何确定三角形在屏幕上的像素

当输入三角形顶点坐标时,如何判断对应屏幕上的像素区域?
image.png

答案: 采样

2.3 采样

采样就是对方程离散化的一个过程,在这里我们通过对每一个像素进行判断,如果它的中心点在三角形内部,那么它就是属于三角形的,我们应该在屏幕上将其画出来,而判断方法之前也说过,可以通过叉乘来实现

  • 感性理解:给你一个连续函数,在不同的地方去问,它的值是多少
  • 采样就是把函数离散化的过程
  • 采样是图形学很重要的一个概念,此处是指利用像素中心对屏幕进行采样

2.4 如何判断像素中心是否在三角形内

image.png

  1. 定义一个inside函数
    image.png

  2. 采样
    image.png

  3. 具体的实现:叉积→全负/正即为三角形内
    P 0 P 1 × P 0 Q P_0P_1 \times P_0Q 结果朝外
    P 1 P 2 × P 1 Q P_1P_2 \times P_1Q 结果朝外
    P 2 P 0 × P 2 Q P_2P_0 \times P_2Q 结果朝内
    由此说明,Q点位于三角形外部

image.png

  1. 一个特殊情况:点在边上怎么办

    • 不做处理(本课程)
    • 特殊处理(OPenGL和DX)
  2. Checking All Pixels on the Screen?
    只需要找到边界包围盒即可。
    image.png

3. Rasterization on Real Displays

image.png

4.锯齿

image.png

走样问题
image.png

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。