2011-08-27 40 views
2

我在评论中将其写为一个问题,但我觉得它值得自己去考虑。使用OpenGL ES 2.0在iPhone/iPad上共轭渐变

我想在iPhone/iPad上构建一个共轭梯度解算器,因为它将为这些设备上的GPGPU编程(例如实时光流/实时模拟/实时有限元素)开辟一个新的可能性领域。

来自GpuGems的写得很好的章节解释了如何使用浮点纹理完成。

我遇到的第一个问题是,我还没有设法创建浮点渲染到纹理。也许我只是没有为我的纹理设置正确的参数。例如,此代码在第一行成功,但第二行代码失败,出现GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT错误。

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 256, 256, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, 0); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureHandle, 0); 

所以,我的问题是我怎么能在iPhone/iPad上渲染到浮点纹理?

另外还有另一种方法来解决这个问题? 我认为一个混乱的替代方案是在碎片着色器中使用浮点纹理,然后通过简单地将其前8位存储在R中,然后将结果16位半浮点数转换为片段着色器中的常规gl_FragColor, G的gl_FragColor。然后我可以使用glReadPixels从FB中读取这些值,并将它们重新解释为半浮点数并将该数据转换为新纹理并重复该过程。 这个明显的问题是,它需要从GPU回到CPU然后回到GPU非常浪费的往返行程,而且很确定它不会给速度带来任何改进。

有没有人有任何想法?

+2

虽然半浮点纹理(尤其是渲染目标)更可能通过iGPUs被supprted,他们不会买任何东西在CG的背景下求解器,我认为,因为我怀疑一半的精度对于实际问题是足够的(单精度可能已经太少了)。我想你需要一个非常好的预处理器,除了矩阵向量产品(至少如果你想击败CPU模式),尤其是在使用片段着色器时,Jacobi预处理器之外的所有东西都比矩阵向量产品更棘手比CUDA/OpenCL更有限。 –

+0

幸运的是,我们将使用雅可比预处理器。我将尝试使用这里描述的方法:http://msdn.microsoft.com/en-us/library/ee416413(v=vs.85).aspx。它看起来是模拟浮动的最佳方式。很明显,编码和解码的代价会很大,但它仍然值得。最后,如果这不起作用,我会使用氖原子,这将保证3倍到8倍。但是那是Il从NEON得到的最多。 – twerdster

+0

如果你的意思是这个RGBE共享指数格式,这更糟糕。你只有9位精度,只有指数完全相同,他们肯定不会。如果精度格式极度降低(可能适用于颜色),当尝试求解真正的线性方程组时,您肯定会遇到问题,特别是在使用简单的Jacobi预处理器时。 –

回答

0

抬头望加快图书馆,VDSP功能