GAMES101 Lecture 05 Rasterization 1(Triangles)

Lecture 05 Rasterization 1 (Triangles)

什么是屏幕

  • 一组像素
  • 数组的大小:分辨率
  • 一种典型的光栅成像设备

光栅

光栅化 == 画在屏幕离

像素

  • 一个个小方块,每个方块中的颜色不会变化(实际上不准确,这样描述只是方便理解)
  • 颜色是RGB三个值的混合

定义屏幕空间

  • 像素的坐标写成\((x,y)\)形式,且为整数
  • 像素坐标\(\in[0,width-1]\)
  • 像素\((x,y)\)中心处于\((x+0.5,y+0.5)\)
  • 一个屏幕覆盖范围从\((0,0) 到(width,height)\)

*不同API的屏幕空间差异

  • OpenGL左下角为\((0,0)\)\(x\)轴向右为正,\(y\)轴向上为正
  • DirectX左上角为\((0,0)\)\(x\)轴向右为正,\(y\) 轴向下为正

标准长方体到屏幕

  • 先不管深度\(z\)

  • 变换到\(xy\)平面(视口变换):\([-1,1]^2->[0,width]\times[0,height]\)

    Viewport(视口)矩阵

    \(M_{viewport}=\begin{pmatrix}\frac{width}{2} & 0 & 0 & \frac{width}{2}\\0 & \frac{height}{2} & 0 & \frac{height}{2}\\0 & 0 & 1 & 0\\0 & 0 & 0 & 1\end{pmatrix}\)

光栅化

三角形

  • 最基础的多边形
    • 所有多边形都可以分解成三角形
  • 独特的数型
    • 一定是平面
    • 内外定义明确
    • 只需定义三个顶点,内部的属性可通过线性插值确定

采样

把一个连续函数离散化z

(带入不同值求出函数值)

for (int x = 0; x < xmax; ++x)
	output[x] = f(x);

采样是图形学中的核心思想

对于完全在三角形内部的像素,其颜色确定,对于在三角形边界上的像素,通过其中心点判断是否在三角形内部

\[inside(t,x,y)= \left\{ \begin{aligned} &1\ Point(x,y)\ in\ triangle\ t\\ &0\ otherwise \end{aligned} \right. \]

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)

如何确定一个点是否在三角形内(inside函数)?

三叉乘,见Lecture 02

边界问题

如果一个点即落在三角形1,又落在三角形2的边界上?

自己定义:如该点可以既在1上又在2上,既不在1上也不在2上等等

在OpenGL中,落在上边和左边算在内部,在下边和右边不算在内部

需要遍历所有像素吗?

使用轴向包围盒(AABB)

处于包围盒外的像素无需遍历

还有更多的加速方法

针对不同情况,有不同方法

posted @ 2024-03-24 11:48  Telluluu  阅读(23)  评论(0)    收藏  举报