我有一个渲染步骤,我想对动态生成的纹理执行。
该算法可以独立地并行操作行。对于每一行,算法将按从左到右的顺序访问每个像素并在原位修改它(如果有帮助,则不需要不同的输出缓冲区)。每个过程都使用状态变量,必须在每行的开头重置,并在遍历列时保持不变。
我可以设置OpenGL着色器,OpenCL等等吗?请提供代码的最小示例。
答案 0 :(得分:2)
如果您可以访问实现EXT_shader_image_load_store或ARB_shader_image_load_store的GL 4.x级硬件,我想您可以将其关闭。否则,通常无法对图像进行原位读/写(尽管NV_texture_barrier有各种方法)。
话虽这么说,一旦你开始希望像素以你的方式分享状态,你就会从并行性中扼杀你的大部分潜在收益。如果为像素计算的值取决于左侧像素的计算,则无法实际并行执行每个像素。这意味着您的算法实际上唯一的并行性是每行。
这不会给你带来太大的收获。
如果确实想要这样做,请使用OpenCL。这种事情更友好。
答案 1 :(得分:0)
是的,你可以做到。不,你不需要4.X硬件,你需要片段着色器(带流量控制),帧缓冲对象和浮点纹理支持。
您需要将数据编码为2D纹理。
存储"状态变量"在每行的第一个像素中,并将其余数据编码到其余像素中。不言而喻,建议使用浮点纹理格式。
使用两个帧缓冲区,并使用更新"状态变量"的片段着色器在循环中将它们相互渲染。在第一列,并在另一列上执行您需要的任何操作,即"当前"。要减少浪费的资源量,您可以将渲染限制为要处理的列。 NVidia OpenGL SDK examples生命游戏"," GDGPU流体"," GPU partciles"以类似方式工作的演示 - 通过将数据编码到纹理中,然后使用着色器来更新它。
但是,因为你可以做到这一点,但这并不意味着你应该这样做,并不意味着它可以保证快速。一些GPU可能具有非常高的存储器纹理存储器读取速度,但是计算速度相对较慢(反之亦然)并且并非所有GPU都具有用于并行处理的许多传送器。
此外,根据您的应用,CUDA或OpenCL可能更合适。