В моем приложении OpenGLES 2 (на SGX535 на Android 2.3, это не имеет значения), у меня есть большая текстура, для которой мне нужно часто делать небольшие обновления.Я настроил это как пару FBO, где я рендерил обновления в задний буфер, а затем рендерил весь задний буфер как текстуру в передний буфер, чтобы «поменять» их.Затем передний буфер используется в качестве текстуры в другом месте сцены.
Обновления иногда представляют собой одноцветные под прямоугольники, но в большинстве случаев обновления представляют собой необработанные данные изображения, в том же формате.в качестве текстуры , например, новые данные изображения поступают как RGB565, а объекты кадрового буфера поддерживаются текстурами RGB565.
Использование glTexSubImage2D () является медленным, как и следовало ожидать, особенно в отложенном режимерендер как SGX.Мало того, что использование glTexSubImage2D на заднем FBO в конечном итоге приводит к сбою приложения где-то в драйвере SGX.
Я попытался создать новые объекты текстуры для каждого под прямоугольника, вызвав glTexImage2D, чтобы инициализировать их, а затем отобразить ихзадний буфер в виде текстурированных четырехугольников.Я сохранил объекты текстуры для двух замен буферов FBO перед их удалением, но, видимо, этого было недостаточно, потому что при повторном использовании идентификаторов текстуры они сохраняли размеры старой текстуры.
Вместо этого,В настоящее время я беру весь буфер необработанных данных изображения и преобразую его в массив структур вершин и цветов, например:
struct rawPoint {
GLfloat x;
GLfloat y;
GLclampf r;
GLclampf g;
GLclampf b;
};
Затем я могу визуализировать этот массив в задний буфер, используя GL_POINTS.Для буфера данных RGB565 это означает выделение буфера буквально в 10 раз больше, чем исходные данные, но на самом деле это быстрее, чем использование glTexSubImage2D ()!
Я не могу сохранить вершины или цвета в их исходных без знакакороткий формат, потому что OpenGL ES 2 принимает плавающие только в атрибутах вершин и униформе шейдеров.Я должен представить каждый пиксель как отдельный набор координат, потому что у меня нет геометрических шейдеров.Наконец, я не могу использовать расширение EGL_KHR_gl_texture_2D_image, поскольку моя платформа не поддерживает его!
Должен быть лучший способ сделать это!Я сжигаю тонны циклов ЦП просто для того, чтобы преобразовать данные изображения в расточительный цветовой формат с плавающей запятой, чтобы графический процессор мог преобразовать его обратно в формат, с которого он начал.
Было бы лучше использовать EGL Pbuffers?Меня не волнует эта перспектива, так как она требует переключения контекста, и я даже не уверена, что она позволит мне писать напрямую в буфер изображения.