计算机图形学.李胜.03.3D图形绘制流水线基础与图形编程

Programmable 3D Graphics Pipeline

1. Vertex Assembly

  • 顶点装配

  • position(坐标)

  • normal(法向)

  • texture coordinate(纹理坐标)

2. Vertex Shader

  • 顶点着色器

(1) transform

  • TL:Transform and Lighting
    • 坐标变换、光照计算
  • \(P_{clip} = (M_{model-view-projection})(P_{model})\)
    • model to world:\(P_{world}=(M_{model})(P_{model})\)
    • world to eye:\(P_{eye}=(M_{view})(P_{world})\)
    • eye to clip:\(P_{clip}=(M_{projection})(P_{eye})\)

(2) vertex -> modified vertex

  • Perform additional per-vertex computations
    • modify, add or remove attributes passed down the pipeline
  • uniforms:常量
  • matrices:矩阵
  • texture:几何细节更加丰富
  • 修改几何属性
  • displacement mapping:位移贴图(映射)

3. Primitive Assembly

  • 图元

  • group vertex

    • triangle,lines,...
  • 逻辑坐标转化为物理坐标

  • 裁剪

4. Rasterizer

  • 光栅化

  • 二维图元转化为像素点

  • 图元属性与 vertex assembly 中一致

  • aliasing:走样问题

5. Fragment Shader

  • 又被称为是 pixel shader
  • 根据光照和物体上色
    • 线性插值,双线性插值
    • 输出颜色
  • 光照计算,下述一般不会同时存在
    • per-fragment lighting(更好,更精细)
    • per-vertex lighting
  • texture:贴图
  • bump mapping:凹凸贴图
    • 扰动法向

6. Per-Fragment Tests

(1) scissor test

  • 裁剪:裁剪掉窗口之外的部分

  • 原因:

    • For performance
    • Post-processing effects
    • Multipass rendering

(2) stencil test

  • 模板( 蒙板 )测试:
    • 可以丢弃窗口中任意区域(以fragment 为单位)
    • 根据 stencil buffer 的内容,来丢弃不需要的 fragments
  • 位运算操作
  • 实现:将模板写入模板缓冲区(stencil buffer),之后在测试中可以使用

(3) depth test

  • 又被称为 z-test
  • 深度测试
    • 例子:等高线,小偏移
    • 如果没有深度测试,那么由于深度相同/浮点精度问题,线时隐时现

7. Blending

  • 混合
  • Combine fragment color with framebuffer color
    • Can weight each color
    • Can use different operations: +, -, etc.
  • 实现半透明(Translucency)的效果

8. FrameBuffer

  • 输出到 FrameBuffer

Evolution of the Programmable

1990s 之前

  • 显卡
  • 无 GPU 的概念,处理能力很弱
  • 图形工作站

90s

  • Pre GPU

  • software rendering:软件渲染

  • 为什么选择 GPU

    • 并行
      • Pipeline parallel
      • Data parallel
      • CPU and GPU executing in parallel
    • 硬件支持
      • texture filtering
      • rasterization
      • sqrt

1996

  • 3dfx Voodoo
  • 软件:
    • vertex assembly,vertex shader,primitive assembly
  • 硬件:
    • rasterizer,fragment shader,pre-fragment tests,blend,framebuffer
    • Fixed-function rasterization, texture mapping, depth testing, etc
    • 4-6MB memory
    • PCI bus
      • Peripheral Component Interconnect
      • 外围组件互连

1999

  • Nvidia Geforce 256
  • 全硬件实现
  • Fixed-function vertex shading(T&L)
  • Multi-texturing:bump maps, light maps, etc.
  • Direct3D 7
  • AGP bus
    • Accelerated Graphics Port
    • 加速图形端口

2001

  • Nvidia Geforce 3
  • 全硬件实现,但是 vertex shader 可以支持编程
  • fragment shader 支持的不太好
  • Direct3D 8

2004

  • Nvidia Geforce 6
  • 支持很好的 vertex shader,fragment shader 编程
  • vertex shader 可以支持读取 texture
  • Multiple render targets
    • 执行一遍就能输出多个渲染目标
  • PCIe bus
    • peripheral component interconnect express
    • 一种高速串行计算机扩展总线标准,2001年提出,旨在代替 PCI,PCI-X 和 AGP 总线标准
  • OpenGL 2 / Direct3D 9
  • 架构:某一部分的架构是固定的,负载不均衡
    • 6 vertex shader processors
    • 16 fragment shader processors

2006

  • Nvidia Geforce 8
  • 在渲染管线 Vertex Shader 之后加入了 Geometry Shader
    • Geometry Shader:1->n,一个几何图元生成多个几何图元
    • Vertex Shader:1->1
  • Unified shader processors:统一着色器处理器
  • OpenGL 3 / Direct3D 10
  • Support for GPU Compute
  • Geometry Shader
    • 可以读取 texture
    • 粒子系统:Partical System
      • All-GPU Particle Systems
    • 实例化:Instance
      • 可以对原先数据作微小的变化,从而生成很多图案
  • 任意点 O,三角形顶点 A,B,C,三角形 ABC 中任意一点 P

\[ \vec{OP}=\frac{S_{\Delta_{PBC}}\cdot\vec{OA}+S_{\Delta_{PCA}}\cdot\vec{OB}+S_{\Delta_{PAB}}\cdot\vec{OC}}{S_{\Delta_{PBC}}+S_{\Delta_{PCA}}+S_{\Delta_{PAB}}} \]

  • 证明方法:延长 AP 交 BC 于 D,之后反复利用如下定理即可

    • 线段 AB 上一点 C

    \[ \vec{OC}=\frac{|\vec{CB}|\cdot\vec{OA}}{|\vec{AB}|}+\frac{|\vec{CA}|\cdot\vec{OB}}{|\vec{AB}|} \]

  • 如果 P 为重心 G,那么有

\[ S_{\Delta_{GBC}}=S_{\Delta_{GCA}}=S_{\Delta_{GAB}} \\ \vec{OG}=\frac{\vec{OA}+\vec{OB}+\vec{OC}}{3} \]

  • 做细分:subdivision
  • 勾边
  • 1 -> n

Procedural Geometry

  • Procedural Geometry Dynamic Vine Growth on the GPU
  • 藤蔓生长
  • 提供更多细分模板

Patched / Control Points

  • Hull shader:参数
  • Tessellation:镶嵌
  • Domain Shader:实际生成的顶点位置

Displacement Mapping

Nivdia G80

  • unify
  • 统一了,没有物理上区分处理器处理哪一个部分(线程分配)
  • 发展趋势
    • 全部可编程
    • 流程可以修改