我有几个方程式,我在基于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。是否可以编写一个片段着色器,将结果放在输出上的多个像素中?我在哪里可以找到该技术的一个例子?
答案 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);
注意减法而不是加法。通过这种方式,片段完全计算它自己的值,而不是修改邻居。