【问题标题】:GLSL integration functionGLSL集成功能
【发布时间】:2013-10-15 14:51:03
【问题描述】:

关于如何在 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 个像素将是第一行上所有五个像素的总和。最后一个像素将是所有先前像素的总和,包括最后一个像素本身。

【问题讨论】:

    标签: opengl-es sum glsl fragment-shader vertex-shader


    【解决方案1】:

    对于 2D 案例,您要求的内容称为 prefix sumsummed area table (SAT)(这样您可以更轻松地找到在线资源)。

    通过分解为多个并行前缀和传递[1][2],可以在 GPU 上有效地实现求和面积表。
    前缀和可以通过使用本地内存来存储中间部分和来加速(参见example in OpenCLexample in CUDA,原则上可以在OpenGL片段着色器以及图像加载存储或计算着色器中完成:OpenGL Super Bible example,类似的例子可以在 OpenGL Insights 的第 280 页找到)。

    请注意,您可能很快就会遇到精度问题,因为最右边(最下方)像素的总和可能会变得非常大。整数或 fp16 渲染目标很可能由于溢出或缺乏精度而导致失败,fp32 大部分时间都可以工作。

    【讨论】:

    • 这正是我想要的!谢谢。
    • @Damon,你知道如何在没有计算着色器的情况下使用 OpenGL 实现 SAT 吗?超级圣经提供了计算着色器的实现,但我仅限于使用OpenGLES2.0框架。
    • @kelin:我认为使用 ES 2.0 几乎最好在 CPU 上完成。您必须使用从较大纹理中读取的像素着色器渲染到纹理,并且看到您可以执行的纹理获取数量是如何有限的,您可能需要大量的通过,在每个较小的区域上进行部分求和.就像您创建自定义 mipmap 一样。不是说你不能这样做,而是相当痛苦。
    猜你喜欢
    • 1970-01-01
    • 2020-04-13
    • 2011-04-09
    • 1970-01-01
    • 2020-07-19
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    相关资源
    最近更新 更多