atomicMin
atomicMin
在共享内存(通常是 Storage Buffer)中的一个值上,执行线程安全的原子最小值比较与写入操作,确保在大量并行线程竞争写入时,最终存储的是所有候选值中的最小值。
核心优势
从硬件层面保证了“读取-比较-写入”操作的原子性,能够高效、正确地完成并行最小值归约任务,是实现自定义深度缓冲、GPU寻路等高级算法的基础。
常见用途
手动实现深度缓冲(Z-Buffer),找出每个像素处离相机最近的片元。
在GPU加速的寻路算法中,记录到达每个网格节点所需的最小成本。
在物理或事件模拟中,从多个并发事件中找出最早发生的时间点。
如何调整
其效果由 `valueNode`(候选值)参数定义。例如,当 `valueNode` 是深度值时,它会创建标准的深度图。若将其改为材质的粗糙度(roughness),它就会转而寻找并记录每个像素上可见的最光滑表面,生成一张“光滑度图”。它是一个通用的“寻找最小值”工具,而 `valueNode` 定义了“比赛项目”。
代码示例
1// 将 [0,1] 范围的深度值转换为整数
2const fragment_depth_as_int = int( gl_FragCoord.z * 65535.0 );
3// 与缓冲区中的当前最小值比较,并原子性地写入新最小值
4atomicMin( myDepthBuffer.element( screenIndex ), fragment_depth_as_int );