(glsl / hlsl)整合2D纹理的1维

时间:2014-10-25 00:32:02

标签: opengl glsl shader direct3d hlsl

我的问题:

我需要一个着色器来在2D纹理的每一行上执行一种累积和。例如,新纹理的像素[3,3]应该是源纹理的像素[1,3],[2,3]和[3,3]的总和。换句话说,数值积分。

我的纹理大小可能最终会介于64x64和256x256纹素之间,具体取决于性能,因此对每像素总和进行一次蛮力可能是不可能的。

不幸的是,无法在1D纹理数组上使用自动mipmap生成,因为我实际上并未进行常规添加。但是,我可能能够适应使用添加的手动解决方案。

注意:我使用的是GLSL和HLSL,但它们看起来几乎完全兼容。


到目前为止的想法:

我目前的想法是在像素着色器中执行一种手动1d mipmap(使用非插值纹理元素提取),但可能会将每个mipmap级别的大小缩小4或8而不是2。

例如:

  1. 原创(Sum-0)。 [64×64]。
  2. 萨姆-1。 [64x64] - > [16×64]。
  3. 萨姆-2。 [16x64] - > [4x64]。
  4. 萨姆-3。 [4x64] - > [1x64]。 (每一行的总计)。
  5. 完成此操作后,我将通过mipmap级别(从最小值开始),将前一级别的累计和(将大小和偏移量调整为1)添加到同一行段中前一个纹素的总和,并放置一个新的纹理。

    level-N-accum[(a*width)+b,y] =
      level-N+1-accum[a-1,y]
        +
      sum(first b pixels starting from level-N-sum[a*width,y])
    

    例如:

    1. 总积累-2。 [4x64] =(Sum-2 + Sum-3)
    2. 总积累-1。 [16x64] =(Sum-1 + Accum-2)
    3. 结果(Accum-0)。 [64x64] =(Sum-0 + Accum-1)
    4. 这给了我每像素O(ln(X))的复杂度。


      我的问题:

      1. 这是正确的方法还是有更好的方法?
      2. 我会更好地使用计算机(还没有使用过计算机吗?)

1 个答案:

答案 0 :(得分:0)