在 TouchDesigner 的 UV Picking 技术中,一个关键环节是——在 GPU 上高效判断哪些像素是有效点(非黑色像素)。
传统方法通常会把贴图数据转成 CHOP 通道进行判断,但这样会消耗大量 CPU 资源。
Pagra12 在他的教程中演示了一种完全基于 TOP(GPU)运算 的方式,通过简单的数学操作,就能快速生成一张二值化的掩膜图(Mask)。
🧠 问题背景
我们有一张贴图(Texture),其中:
-
黑色像素(RGB=0,0,0)代表“无效点”
-
有颜色或亮度的像素代表“有效点”
目标是生成一张黑白图:
-
白色(1)表示有效像素
-
黑色(0)表示无效像素
但在 GPU 的纹理操作中,无法直接编写 if 判断语句。
因此,我们需要用一套数学变换来替代逻辑判断。
⚙️ 实现思路
这一部分由三个主要步骤组成:
1️⃣ Square + Add + Root —— 计算像素亮度强度
对每个像素的三个通道进行平方并求和:
Intensity=R2+G2+B2Intensity = R^2 + G^2 + B^2
-
黑色像素
(0,0,0)→ 结果为0 -
非黑色像素
(0.2,0.5,0.7)→ 结果大于0
这一步可以理解为计算像素的亮度或强度。
实际上不需要真的取平方根(Root),因为平方和已经足以区分 0 和非 0。
2️⃣ Ceiling —— 将非零值变为 1
接着用上取整操作(Ceiling TOP)处理结果:
| 原始亮度值 | Ceiling 结果 |
|---|---|
| 0.0 | 0 |
| 0.3 | 1 |
| 0.9 | 1 |
| 1.2 | 2 |
这样,任何非零像素都会被变为 1,而黑色像素依然是 0。
这就把原始图转成了一个「布尔状态图」——0 或 1。
3️⃣ Limit —— 限制数值范围
由于上取整后可能出现像素值大于 1(例如 1.2 → 2),
因此需要通过 Limit TOP 把数值范围限制在 0,10,1 之间:
输出结果是一张干净的二值化图像。
🧾 最终结果:黑白掩膜图(Mask)
经过以上三步,我们得到:
| 颜色 | 含义 |
|---|---|
| 白色 (1) | 有效像素(有亮度、有点存在) |
| 黑色 (0) | 无效像素(背景或空白区域) |
这张掩膜图可以被用来:
-
统计有效像素数量(例如用 Analyze TOP → Sum)
-
在 GPU 上重新排列点数据(通过 Point Repack)
-
或用于下一步 Shader 运算中的点过滤
💡 总结
这段数学变换的意义在于:
用连续的 GPU 图像算子(TOP)模拟逻辑判断,从而在显卡上高效筛选像素。
它避开了 CPU 的参与,大幅提升实时性能。
这种思路在 TouchDesigner 的 UV Picking、粒子筛选、点云处理等场景中都非常有用。


暂无评论内容