计算机图形学.李胜.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
- 统一了,没有物理上区分处理器处理哪一个部分(线程分配)
- 发展趋势
- 全部可编程
- 流程可以修改