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 来降低访存延时
  • 需要大量带宽,所以功耗高
  • 渲染管线执行流畅, 从顶点到片段一口气弄完
block-beta
    columns 1
    block:pipeline
        A["Vertex<br>Processing"] space B["Clip<br>Cull"] space D["Raster"] space E["Early-Z<br>Test"] space F["Texture<br>Fragment"] space G["Alpha<br>Test"] space L["Late-Z<br>Test"] space H["Alpha<br>Blend"]
        A --> B
        B --> D
        D --> E
        E --> F
        F --> G
        G --> L
        L --> H
    end
    space
    block:vram
        VD["Geometry<br>Data"] space:7 TD["Texture<data>Data"] space:3 ZB["Depth<br>Buffer"] space FB["FrameBuffer"]
    end
    VD --> A
    TD --> F
    L --> ZB
    ZB --> L
    H --> FB
    FB --> H

TBR

  • 一小块一小块渲染, 对于每一小块来说,所需要的访存的带宽就相对较小,可以在片上做一小块高速缓存
  • 需要的带宽小,所以功耗低
block-beta
    columns 1
    block:pipeline
        A["Vertex<br>Processing"] space B["Clip<br>Cull"] space C["Tiling"] space D["Raster"] space E["Early-Z<br>Test"] space F["Texture<br>Fragment"] space G["Late-Z<br>Test"] space H["Alpha<br>Blend"]
        A --> B
        B --> C
        D --> E
        E --> F
        F --> G
        G --> H
    end
    block:onchip
        space:12 ZC["On-Chip<br>Depth Buffer"] space CC["On-Chip<br>Color Buffer"]
    end
    space
    block:vram
        VD["Geometry<br>Data"] space:4 PL["Primitive List<br>Vertex Data"] space:4 TD["Texture<data>Data"] space:3 FB["FrameBuffer"]
    end
    VD --> A
    C --> PL
    PL --> D
    TD --> F
    G --> ZC
    ZC --> G
    H --> CC
    CC --> H
    CC --> FB
    FB --> CC

    style onchip   fill:#00bc00,stroke:#ff0000,stroke-dasharray:5 5

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

References