关于如何在 GLSL 着色器中实现高效积分函数(如 SumX 和 SumY)的任何建议?
SumX(u) = 关于 x 的积分 = I(u0,y) + I(u1,y) +... + I(uN,y); u=归一化 x 坐标 SumY(v) = 关于 y 的积分 = I(x,v0) + I(x,v1) +... + I(x,vN); v=归一化 y 坐标
例如,第一行的第 5 个像素将是第一行上所有五个像素的总和。最后一个像素将是所有先前像素的总和,包括最后一个像素本身。
关于如何在 GLSL 着色器中实现高效积分函数(如 SumX 和 SumY)的任何建议?
SumX(u) = 关于 x 的积分 = I(u0,y) + I(u1,y) +... + I(uN,y); u=归一化 x 坐标 SumY(v) = 关于 y 的积分 = I(x,v0) + I(x,v1) +... + I(x,vN); v=归一化 y 坐标
例如,第一行的第 5 个像素将是第一行上所有五个像素的总和。最后一个像素将是所有先前像素的总和,包括最后一个像素本身。
您所要求的称为2D 案例的前缀总和或总面积表 (SAT)(这样您就可以更轻松地找到在线资源)。
通过分解为多个并行前缀和传递[1]、[2] ,可以在 GPU 上有效地实现求和区域表。
前缀和可以通过使用本地内存存储中间部分和来加速(参见OpenCL中的示例或CUDA中的示例,原则上可以在 OpenGL 片段着色器以及图像加载存储或计算着色器中完成: OpenGL Super Bible 示例,类似示例可在 OpenGL Insights 中找到,第 280 页)。
请注意,您可能很快就会遇到精度问题,因为最右边(最下方)像素的总和可能会变得非常大。整数或 fp16 渲染目标很可能由于溢出或缺乏精度而导致失败,fp32 大部分时间都可以工作。