Существует как минимум два принципиально разных подхода:
1.Обновить пиксели (я полагаю, это то, что вы имеете в виду в вопросе)
Наиболее эффективный метод изменения пикселей в текстуре называется Render-to-Texture и может быть выполнен в OpenGL / OpenGL ES.через FBOs .В настольном OpenGL вы можете использовать объекты пиксельного буфера ( PBOs ) для манипулирования пиксельными данными непосредственно в графическом процессоре (но OpenGL ES пока не поддерживает это).
В нерасширенном OpenGL вы можете изменять пикселив системной памяти, а затем обновите текстуру с помощью glTexImage2D / glTexSubImage2D - но это неэффективное решение в крайнем случае, и его следует избегать, если это возможно. glTexSubImage2D обычно намного быстрее, поскольку обновляет только пиксели внутри существующей текстуры, в то время как glTexImage2D создает совершенно новую текстуру (в качестве преимущества вы можете изменить размер и формат пикселя текстуры).С другой стороны, glTexSubImage2D позволяет обновлять только части текстуры.
Вы говорите, что хотите, чтобы она работала с OpenGL ES, поэтому я предлагаю сделать следующие шаги:
- замените glTexImage2D () на glTexSubImage2D () - если вы наберете достаточную производительность, вот и все, просто позвольте;
- реализуйте рендеринг в текстуру с FBO и шейдерами - это потребует гораздо больше работы для переписывания вашегокод, но даст еще лучшую производительность.
Для FBO код может выглядеть следующим образом:
// setup FBO
glGenFramebuffers( 1, &FFrameBuffer );
glBindFramebuffer( GL_FRAMEBUFFER, FFrameBuffer );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, YourTextureID, 0 );
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
// render to FBO
glBindFramebuffer( GL_FRAMEBUFFER, FFrameBuffer );
glViewport( 0, 0, YourTextureWidth, YourTextureHeight );
your rendering code goes here - it will draw directly into the texture
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
// cleanup
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
glDeleteFramebuffers( 1, &FFrameBuffer );
Имейте в виду, что не все пиксельные форматы могут быть отображены.RGB / RGBA обычно в порядке.
2.Обновить геометрию
Вы также можете изменить геометрию объекта, на который наложена ваша текстура.Геометрия должна быть достаточно мозаичной, чтобы обеспечить плавное взаимодействие и предотвратить появление артефактов.Деформация геометрии может быть выполнена разными методами: параметрические поверхности, NURBS, патчи.