Opengl es GLSL积分函数

Opengl es GLSL积分函数,opengl-es,sum,glsl,fragment-shader,vertex-shader,Opengl Es,Sum,Glsl,Fragment Shader,Vertex Shader,关于如何在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坐标 例如,第一行的第五个像素将是第一行上所有五个像素的总和。最后一个像素是之前所有像素的总和,包括最后一个像素本身。您需要的是调用或2D案例(这样您可以更容易地找到在线资源) 通过分解成几个并行前缀和过程,可以在GPU上高效地

关于如何在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坐标


例如,第一行的第五个像素将是第一行上所有五个像素的总和。最后一个像素是之前所有像素的总和,包括最后一个像素本身。

您需要的是调用或2D案例(这样您可以更容易地找到在线资源)

通过分解成几个并行前缀和过程,可以在GPU上高效地实现求和面积表。
前缀和可以通过使用本地内存存储中间部分和来加速(请参阅或,原则上也可以在OpenGL片段着色器以及图像加载存储中进行加速,或在计算着色器中进行加速,类似的示例见第280页的OpenGL Insights)


请注意,您可能会很快遇到精度问题,因为最右边(最下面)像素的总和可能会非常大。Integer或fp16渲染目标很可能由于溢出或精度不足而导致失败,fp32将在大多数情况下正常工作。

这正是我想要的!谢谢。@Damon,你可能知道如何在没有计算着色器的情况下用OpenGL实现SAT吗?《超级圣经》提供了计算着色器的实现,但我仅限于使用OpenGLES2.0框架。@kelin:我认为使用ES 2.0在CPU上实现几乎是最好的。您必须使用从较大纹理读取的像素着色器渲染到纹理,并且看到可以执行的纹理获取数量是如何受到限制的,您可能需要大量的过程,在每个过程中的较小区域上进行部分求和。与创建自定义mipmap非常相似。并不是说你做不到,但这很痛苦。