Shader Graph中实现像素最大通道置1其余置0的最优方案问询
Shader Graph实现单通道最大化(最大通道设1,其余设0)
需求说明
需要对纹理的每个像素执行操作:将数值最大的通道设为1,其余通道设为0,示例如下:
| 通道格式 | 输入值 | 输出值 |
|---|---|---|
| RGBA | (0.5, 0.3, 0.4, 0.3) | (1, 0, 0, 0) |
| RGBA | (0, 0.8, 0.9, 1) | (0, 0, 0, 1) |
最优节点实现方案
你的思路本身已经非常高效,在Shader Graph里可以用最少节点完成,甚至还能进一步精简:
核心实现步骤(仅3个节点)
- 采样纹理:用
Texture 2D节点获取目标纹理的RGBA向量输出。 - 取通道最大值:将纹理输出接入
Component Max节点,得到所有通道的最大值m。这个节点能直接对向量的所有分量取最大值,不用拆分通道,节省操作。 - 批量比较赋值:用
Vector Greater Than Or Equal节点,一端输入纹理的RGBA向量,另一端输入由m复制四次组成的向量(可以用Vector Constructor节点快速生成(m, m, m, m))。该节点会对每个通道逐一比较,输出的向量中,等于最大值的通道为1,其余为0。
替代简化方式
如果不想用Vector Constructor,也可以直接用Step节点:把m作为Step节点的Edge输入,纹理RGBA向量作为In输入,Step节点会直接对每个分量执行c_i >= m ? 1 : 0的操作,一步得到结果,节点数量更少。
说明
- 以上两种方式的节点数量都控制在3个以内,性能开销极低,是Shader Graph里的最优实现。
- 如题目假设,若存在多通道数值相同的情况,结果无需保证唯一性,该实现完全符合要求。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

