2013-06-06 4 views
0

Мне нужно изменить детали из текстуры, но для того, чтобы быть в курсе текущих данных текстуры вместо их замены.OpenGL/OpenGL ES update texture

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

Одно решение пустошь быть кэшировать данные текстуры в памяти и сделать операцию смешивания перед использованием glTexSubImage2D и использовать glTexSubImage2D с результатом, но это будет просто тратить память ...

Есть ли функция, общие для обоих настольные OpenGL и OpenGL ES 2.0, которые позволят мне это сделать?

+0

Возможно, вы можете загрузить текущую текстуру как текстуру для шейдера, а также новую текстуру, выполнить операцию, используя оба из них, и вывести ее на 'gl_FragColor' – Fonix

+0

@Fonix. Мне нужно часто обновлять текстуру. Я рисую. – Felics

+0

Вы должны уметь назначать PBO в качестве рендеринга, выполнять смешение с помощью обычного рендеринга OpenGL, а затем связывать его как источник пикселя и создавать из него текстуру. –

ответ

2

Конечно, glTexSubImage2D перезаписывает любые предыдущие данные, и выполнение этого на CPU не является вариантом (это будет не просто потерять память, но еще более важно, время).

Что вы можете сделать, хотя используете framebuffer object (FBO). Вы прикрепляете текстуру назначения в качестве целевой цветной рендеринга FBO, а затем просто визуализируете новые данные поверх нее, создавая текстурированный квадрат. Субрегион может быть отрегулирован либо с настройкой видового экрана, либо с размером квадрата и положением. Для фактической операции вы можете либо использовать существующую функциональность смешивания OpenGL, если это достаточно, либо использовать для нее пользовательский шейдер фрагментов (но в этом случае вы не можете просто визуализировать новые данные поверх старого, но должны использовать как новые, так и старые данные в виде текстур и превратить материал в совершенно новую текстуру, поскольку в противном случае у вас нет доступа к старым данным внутри шейдера).