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

Ios opengl:使用着色器时,我可以写入输出缓冲区中的多个位置吗?,ios,opengl-es,gpu,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[(

我有几个方程式,我在一个基于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>
  }
}
for(y=0;y
我认为这段代码可以(也应该)被扔到GPU上,可能是通过GPUImage。诀窍是输出——根据我的理解,我只能将着色器的结果放入gl_FragColor。是否可以编写一个片段着色器,将结果放入输出上的多个像素中?我在哪里可以找到这种技术的例子

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

不可以。着色器设计为单独工作。这就是为什么他们这么快

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

假设
将x和y作为输入,则可以从中获取。如果
的输出,则着色器程序可能如下所示:

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);
注意减法而不是加法。以这种方式,片段完全计算它自己的值,而不是修改邻居

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

不可以。着色器设计为单独工作。这就是为什么他们这么快

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

假设
将x和y作为输入,则可以从中获取。如果
的输出,则着色器程序可能如下所示:

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);
注意减法而不是加法。这样,fragment就可以完全计算它自己的值,而不是修改邻居。

@Kimi--我很担心,但看起来我不得不接受它。@Kimi--我很担心,但看起来我不得不接受它。