着色器内存访问 Shader Memory Access
着色器在高度流水线化的系统中执行时,由于其读写操作的顺序在很大程度上未定义,可能会引发排序和同步问题。
-
着色器内存访问顺序:
- 对于顶点着色器和细分评估着色器,尽管对于应用程序指定的每个唯一顶点至少执行一次,但在某些情况下可能因实现相关的因素而多次执行。
- 片段着色器的执行次数取决于多种因素,如像素所有权测试、剪裁测试结果及多重采样片段操作的影响;启用早期每片段测试时,若片段在早期测试阶段被丢弃,则不会执行片段着色器。当帧缓冲区不包含多重采样缓冲时,每个片段仅执行一次着色器调用;否则,根据覆盖的样本数,调用次数在1到N之间,如果声明了按样本着色,则精确执行N次。
- 若片段着色器处理的是由几何着色器生成的但并未被当前正在光栅化处理的图元覆盖的片段或样本,那么存储操作、原子操作和原子计数器更新将无效。
- 同一类型的着色器调用之间的相对顺序是未定义的,不同着色器类型的调用顺序也是如此。不过,一个着色器阶段产生的输出作为下一阶段输入时,保证前一阶段的所有着色器调用已经执行完毕并生成最终值。
-
着色器内存访问同步:
- 着色器调用间由于限制导致无法在单一图元集合内部实现某种形式的同步。例如,一个调用依赖另一个调用写入的内存时,不能确保另一个调用已经被启动且完成写入。
- 在单个着色器调用内部针对不同内存位置发出的存储指令可能不会按照执行顺序对其他调用可见。
- 内置函数
memoryBarrier
可用于提供单个着色器调用内读写操作的更强