Я написал это как вопрос в комментарии, но я чувствую, что это стоит своего собственного вопроса.
Я хотел бы создать решатель сопряженных градиентов на 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?
Или есть другой способ решения этой проблемы?Я подумал, что одной грязной альтернативой будет использование текстур с плавающей запятой в фрагментном шейдере, а затем рендеринг получающегося 16-битного полуплава в обычный gl_FragColor в фрагментном шейдере, просто сохраняя его первые 8 бит в R и вторые 8 бит в Gиз gl_FragColor.Затем я мог бы прочитать эти значения из FB, используя glReadPixels, и интерпретировать их как половину числа с плавающей запятой, перенести эти данные в новую текстуру и повторить процесс.Очевидная проблема с этим заключается в том, что он требует очень расточительного возврата от графического процессора обратно к центральному процессору, а затем обратно к графическому процессору, и я уверен, что это не даст никакого улучшения скорости.
У кого-нибудь есть идеи?