Render To Texture

Render-To-Texture 是一种十分常见和简单的渲染技术,它将纹理对象和 FBO 绑定,把场景渲染到纹理中,以便之后可以反复使用。RTT 被广泛应用在 in-game cameras(virtual camera systems), post-processing 和各种特效中。本文主要比较 RTT 技术在两种不同的渲染架构下的不同和一些思考。

rtt-on-tbr

IMR vs TBR

IMR (Immediate Mode Rendering) 和 TBR (Tile-Based Rendering) 是两种不同的渲染架构,前者常见于桌面 GPU (NVIDIA, AMD), 后者常见于移动 GPU (Imagination, Mali)。

IMR

  • 一整块一整块渲染,需要大量访存,所以必须有比较大的 L1, L2 Cache 来降低访存延时
  • 需要大量带宽,所以功耗高
  • 渲染管线执行流畅, 从顶点到片段一口气弄完
Vertex
Processing
Clip
Cull
Raster
Early-Z
Test
Texture
Fragment
Alpha
Test
Late-Z
Test
Alpha
Blend
Geometry
Data
TextureData
Depth
Buffer
FrameBuffer

TBR

  • 一小块一小块渲染, 对于每一小块来说,所需要的访存的带宽就相对较小,可以在片上做一小块高速缓存
  • 需要的带宽小,所以功耗低
Vertex
Processing
Clip
Cull
Tiling
Raster
Early-Z
Test
Texture
Fragment
Late-Z
Test
Alpha
Blend
On-Chip
Depth Buffer
On-Chip
Color Buffer
Geometry
Data
Primitive List
Vertex Data
TextureData
FrameBuffer

由上面的两张图可以看到,在 TBR 架构下,GPU 产生的每个像素并不是直接写入显存的,而是暂存在片上的 Color Buffer 中,对于 RTT 来说,如果渲染得到的纹理作为后面绘制命令的源纹理,那么如果没有显式地将还存在于片上的 Color Buffer 刷新入显存中,那么当前的绘制中,纹理采样获取的纹素就是旧数据。

References