Как загрузить суб прямоугольники данных изображения в текстуру буфера кадров OpenGLES 2? - PullRequest
3 голосов
/ 29 августа 2011

В моем приложении 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?Меня не волнует эта перспектива, так как она требует переключения контекста, и я даже не уверена, что она позволит мне писать напрямую в буфер изображения.

1 Ответ

1 голос
/ 03 октября 2011

Я немного новичок в графике, поэтому возьмите это с большой долей соли.

Создайте собственный буфер (см.) Размер вашей текстуры. Используйте собственный буфер для создания изображения EGL

eglCreateImageKHR(eglGetCurrentDisplay(), 
                  eglGetCurrentContext(),
                  EGL_GL_TEXTURE_2D_KHR, 
                  buffer, 
                  attr);

Я знаю, что используется EGL_GL_TEXTURE_2D_KHR.Вы уверены, что ваша платформа не поддерживает это?Я работаю на платформе, которая также использует SGX535, и моя, кажется, поддерживает ее.

После этого, как обычно, свяжите текстуру.Я полагаю, что вы можете использовать memcpy в своем собственном буфере, чтобы очень быстро обновлять под прямоугольники.

Я понимаю, что отвечаю на месячный вопрос, но если вам нужно увидеть еще какой-нибудь код или что-то еще, дайте мне знать.1010 *

...