三種API的NDC區別
NDC全稱,Normalized Device Coordinates
Metal、Vulkan、OpenGL的區別如下:
feature | OpenGL NDC | Metal NDC | Vulkan NDC |
---|---|---|---|
坐標系 | 右手 | 左手 | 右手 |
z值范圍 | [-1,1] | [0,1] | [0,1] |
xy視口范圍 | [-1,1] | [-1,1] | [-1,1] |
GPU渲染的定點數和浮點數
定點數類型:ARGB8888,RGB565,ARGB2101010,
浮點數:ARGB16161616,ARGB32323232,
加起來都是機器字長,32、64、128
定點數只能保存 【0-1】的范圍,不能保存小于0和超過1的數據,超過部分會被直接截斷。否則只能用浮點數來承接。
GPU內部計算可以保留精度,比如shder中的計算都是float(high、mid、low),移動端的TBR架構下從 board memory拷貝到tile的memory-on-chip的時候,片上存儲和計算一般也是浮點數。只是tile處理完,輸出的時候會有精度轉化,會損失掉。
FP16格式的FBO,在上一次渲染會話退出的時候,也能保存大于1的情況,
FP buffer的用途
1)HDR渲染中,對圖像做headroom倍數提量以后,顏色值會出現大于1的情況,比如提亮5倍,最終渲染目標中可能需要保存5.0的值,此時至少得FP16來存儲。
2)色域轉化中的大轉小的場景,
P3轉sRGB,BT2020轉P3或者sRGB 都會出現負數,此時也需要用FP16存儲,即scRGB。
不過色域轉化必須在線性空間中處理,
- 非線性域是用來表示光信號(連續的),
- 線性域用來表示電信號,離散的(比如8bit 或者 10bit表示)