计算机图形学
  • 计算机图形学
  • 光栅化
    • 光栅化流程
    • 采样
    • 走样
    • 抗走样
    • 空间变换
    • 简单的相机变换
    • 3D旋转与复数表示
    • 深度和透明度
  • 几何建模
    • 几何介绍
    • 网格和流形
  • 材质与光线
    • 几何查询
    • 几何查询加速
    • 着色与阴影
Powered by GitBook
On this page
  • 两种把图像放到屏幕上的技术
  • 光栅化
  • 光线追踪
  • 光栅化流程 Rasterization pipeline
  • 填充像素来绘制直线
  • 增量线光栅化
  • 采样函数
  • 如何确定一个点在三角形内
  • 直线方程推导
  • 直线方程测试
  • 三角形内点测试:三线测试
  • OpenGL/Direct3D 边缘规则
  • 如何加速三角形的绘制过程
  • 包围盒加速三角形遍历
  • 增量三角形遍历
  • 并行覆盖检测
  • 混合方法:平铺三角形遍历
  • 分层策略
  1. 光栅化

光栅化流程

Previous计算机图形学Next采样

Last updated 4 months ago

屏幕是一个(二维)像素数组,数组的大小就是分辨率(resolution),是一种典型的光栅显示器。像素(pixel)可以被当作是一个颜色均匀的小方块,颜色是(red,green,blue)三色的混合。

两种把图像放到屏幕上的技术

光栅化

  • 对于每个图像基元(primitive),如三角形,点亮哪些像素

  • 非常快(在GPU中数十亿个三角形每秒)

  • 很难(但并非不可能)实现真实图片效果

  • 非常适合2d vector art,fonts,quick 3D preview

光线追踪

  • 对于每个像素我们可以看到哪些图像基元,很容易实现真实图像效果,一般来讲很慢。

光栅化流程 Rasterization pipeline

基于光栅化的现代实时图像生成

  • Input:图像基元——基本都是点(points)和三角形(triangles),可能有其他属性(例如颜色)

  • output:图像(可能有深度、透明度等)

光栅化管道将所有的图像基元转换为三角形,因为三角形可以近似任何形状,总是平面的,有定义明确的法线。我们可以定义良好的三角形顶点插值(重心插值法)。一旦所有东西都被简化为三角形,就可以专注于设计一个深度优化的绘制过程。

填充像素来绘制直线

钻石规则(现代GPU使用):如果线穿过相应的钻石,就点亮像素。

增量线光栅化

这种方式易于实现,但是不是当代软件/硬件画线的唯一方式。

采样函数

测量一个函数在某点的值就是采样 Sampling。我们可以通过周期采样来离散化函数。

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

采样是图形学的核心思想,可以采样时间(1D)、面积(2D)、和体积(3D)。

若像素中心在三角形内,则采样。光栅化其实就是采样一个2D指示函数。

如何确定一个点在三角形内

三角形其实就三个半平面的交集:

直线方程推导

直线方程测试

三角形内点测试:三线测试

OpenGL/Direct3D 边缘规则

当采样点落在边上时,如果边是“顶边”或“左边”,则该采样被分类为三角形内

  • 顶边(top edge):高于所有其他边的水平边

  • 左边(left edge):非水平且位于三角形左侧的边(三角形可以有一个或两个左边)

如何加速三角形的绘制过程

包围盒加速三角形遍历

增量三角形遍历

通过增量式技术提高半平面检查的计算效率。增量式方法以一种与数据在内存中的排列方式相一致的模式访问内存,这可以大大提高渲染的速度。

并行覆盖检测

增量式遍历是串行的,现代硬件支持高度并行计算。所以可以有一种替代方案:并行检测三角形“包围盒”内所有样本点,大量的并行可以抵消额外的测试。

但是对于一个细长的三角形,初级的并行策略依然非常低效。

混合方法:平铺三角形遍历

理念:从粗到细,首先检查块是否与三角形相交,如果没有,完全跳出此块。如果块包含在三角形内,则块内所有点都被覆盖了。否则,并测试块中的每个采样点。

分层策略

一条线可以定义一个半平面
一个直线向量
2D上一个向量的垂直向量
直线向量的法线向量