opengl:使用着色器时,我可以写入输出缓冲区中的多个位置吗?

时间:2013-01-05 00:39:36

标签: ios opengl-es gpu

我有几个方程式,我在基于CPU的程序中运行,以处理iOS的图像。输出格式为:

for (y = 0; y < rows; ++y){
  for (x = 0; x < cols; ++x){
    <do math>
    outputImage[y*cols + x] += <some result>
    outputImage[y*cols + (x+1)] += <some result>
    outputImage[(y+1)*cols + x] += <some result>
  }
}

我认为这个代码可以(并且应该)被抛到GPU上,可能是通过GPUImage。诀窍是输出 - 根据我的理解,我只能将着色器的结果放入gl_FragColor。是否可以编写一个片段着色器,将结果放在输出上的多个像素中?我在哪里可以找到该技术的一个例子?

1 个答案:

答案 0 :(得分:1)

  

是否可以编写将结果放入更多内容的片段着色器   输出上的一个像素?

没有。着色器旨在单独工作。这就是他们这么快的原因。

您应该将算法重构为“着色器友好”。尝试提取输入,以便他们可以为算法计算单个片段的单个值。尽量避免分支和循环,否则将计算保留在CPU上可能是个好主意。

假设<do math>将x和y作为输入,可以从gl_FragCoord获取。如果<some result><do math>的输出,则您的着色器程序可能如下所示:

vec4 location = getLocation(gl_FragCoord);
gl_FragColor += do_math(location.x, location.y);
gl_FragColor += do_math(location.x-1, location.y);
gl_FragColor += do_math(location.x, location.y-1);

注意减法而不是加法。通过这种方式,片段完全计算它自己的值,而不是修改邻居。