三种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表示)