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)
处于包围盒外的像素无需遍历
还有更多的加速方法
针对不同情况,有不同方法
标签:Rasterization,0.5,像素,width,Lecture,三角形,height,屏幕,Triangles From: https://www.cnblogs.com/Tellulu/p/18092215