atomicMax
atomicMax
在共享内存(通常是 Storage Buffer)中的一个值上,执行线程安全的原子最大值比较与写入操作,确保在大量并行线程竞争写入时,最终存储的是所有候选值中的最大值。
核心优势
从硬件层面保证了“读取-比较-写入”操作的原子性,能够高效、正确地完成并行最大值归约任务,将复杂的“多方竞争,胜者为王”的逻辑简化为单个函数调用。
常见用途
寻找并记录每个像素的最远深度值,用于体积雾或后期处理特效。
在流体或粒子模拟中,追踪每个网格单元经历过的最大速度或压强。
生成影响力图,通过比较打包的“强度+ID”值来确定每个点的最强影响源。
如何调整
其效果通过调整 `valueNode`(候选值)来改变。例如,在生成地形图时,`valueNode` 是物体的高度;若将其改为材质的金属度,`atomicMax` 就会转而寻找并记录每个像素上可见的最强金属感材质,从而生成一张金属度分布图而非地形图。它是一个通用的“寻找冠军”工具,而 `valueNode` 定义了“比赛项目”。
代码示例
1// 将世界坐标Z值(高度)转换为整数
2const world_z_as_int = int( positionWorld.z * 100.0 );
3// 与缓冲区中的当前最大值比较,并原子性地写入新最大值
4atomicMax( heightmapBuffer.element( screenIndex ), world_z_as_int );