Explorar el Código

Rasterization

usuiforhe hace 3 años
padre
commit
fdf057e10f
Se han modificado 3 ficheros con 67 adiciones y 2 borrados
  1. BIN
      图形学/Image/20.png
  2. BIN
      图形学/Image/21.png
  3. 67 2
      图形学/图形学.md

BIN
图形学/Image/20.png


BIN
图形学/Image/21.png


+ 67 - 2
图形学/图形学.md

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2021-10-01 11:33:27
- * @LastEditTime: 2022-02-20 18:56:59
+ * @LastEditTime: 2022-02-20 21:15:21
  * @LastEditors: Please set LastEditors
  * @Description: In User Settings Edit
  * @FilePath: D:\MarkdownLog\图形学.md
@@ -842,11 +842,76 @@ $$
 
 将得到的矩阵与(x,y,z,1)相乘后z的值等于(-nf)*z^(-1)+(n+f),是个反比例函数,这个图像恒过(n,n)与(f,f),在n与f之间,z是下凹的,所以z变小了,即再f与n平面之间的点的z是会变小的
 
-# 光栅化
+# 光栅化(Rasterization)
 
 将三维空间的几何形体显示到屏幕上  
 将投影的基本体分解为片段(像素)  
 
+通过前面的视图变换、投影变换(正交、透视),我们得到了\[-1, 1\]^3的标准立方体
+
+- 定义视锥需要的两个数据
+  - 宽高比
+  - 垂直的可视角度
+
+![](./Image/20.png)
+
+- **屏幕**:图形学中认为屏幕是一个数组,数组中每一个元素是一个像素
+- **光栅**:Raster,就表示屏幕,光栅化(Rasterize)可以理解为把东西绘制在屏幕上
+- **像素**:Pixel(Picture Element的缩写)
+- **屏幕空间**:在屏幕上定义的坐标系,屏幕左下角为(0, 0)原点,向上为Y轴正方向,向右为X轴正方向
+  - 坐标从0开始,而不是从1开始
+  - 屏幕的所有的像素是从(0, 0)到(width - 1, height - 1)
+  - (x, y)点像素的中心在(x + 0.5, y + 0.5)上
+  - 屏幕表示的范围从(0, 0)到(width, height)
+
+- 在不考虑Z轴的情况下,将\[-1, 1\]的矩阵的x、y坐标映射到屏幕中
+  - 移动到屏幕中心
+  - 缩放一下
+$$
+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}
+$$
+
+- 图形学广泛使用三角形
+  - 三角形是最基础的多边形
+  - 任何多边形都可以被拆分成多个三角形
+  - 三角形三个点肯定在同一个平面
+  - 三角形内外定义清晰(多边形可能有洞 圆环,可能不是凸包)
+  - 三角形三个点定义不同属性,三角形内部的各个点可以逐渐渐变
+
+利用像素中心,对屏幕空间进行采样
+
+![](./Image/21.png)
+
+$$
+inside(tri, x, y) =
+\begin{cases}
+    1, Point(x, y) 在 tri 这个形状中 \\
+    0, Point(x, y) 不在 tri 形状中
+\end{cases}
+$$
+
+```cpp
+for(int x = 0; x < width; ++x){
+    for(int y = 0; y < height; ++y){
+        image[x][y] = inside(tri, x+0.5, y+0.5)
+    }
+}
+```
+
+> 通过上述代码就可以知道(x, y)像素是否在多边形中,因为像素中心坐标是(x+0.5, y+0.5),所以传入的是像素中心坐标
+
+那么如何判断像素点是否在三角形内呢? 最开始将的**叉乘**就可以用到了  
+
+判断像素是否在三角形中不用判断(0, 0)到(width, height)中所有的像素,只需要判断三角形三个点中最高、最低、最左、最右所围城的矩阵即可,这个矩阵被称为**包围盒**
+
+
+
 # 几何
 
 如何表示光滑的曲线、曲面、将简单曲面通过细分的方法得到复杂曲面、形状发生变化时面如何变化、如何保持物体的拓扑结构…