1

我在基于 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 中。是否可以编写一个片段着色器,将结果放入输出的多个像素中?我在哪里可以找到该技术的示例?

4

1 回答 1

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);

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

于 2013-01-05T15:54:28.723 回答