Для тех, кто застрял с OpenGL ES 1.1 / 2.0 в 2018 году и позже, я провел несколько тестов с различными методами, как обновить часть текстуры из данных изображения (изображение того же размера, что и текстура). 1003 *
Метод 1: Копирование всего изображения с помощью glTexImage2D :
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, mWidth, mHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_Pixels );
Метод 2: Копирование всего изображения с помощью glTexSubImage2D :
glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, m_Pixels );
Метод 3: Копирование части изображения построчно в цикле:
auto *ptr = m_Pixels + (x + y * mWidth) * 4;
for( int i = 0; i < h; i++, ptr += mWidth * 4 ) {
glTexSubImage2D( GL_TEXTURE_2D, 0, x, y+i, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, ptr );
}
Метод 4: Копировать всю ширину изображения, но вертикально скопировать только часть, которая изменилась:
auto *ptr = m_Pixels + (y * mWidth) * 4;
glTexSubImage2D( GL_TEXTURE_2D, 0, 0, y, mWidth, h, GL_RGBA, GL_UNSIGNED_BYTE, ptr );
А вот результаты теста, проведенного на ПК, в 100000 раз обновляющего различные части текстуры, которые были примерно на 1/5 размера всей текстуры.
- Метод 1 - 38,17 с
- Метод 2 - 26,09 с
- Метод 3 - 54,83 с - самый медленный
- Метод 4 - 5,93 с - победитель
Не удивительно, что метод 4 является самым быстрым, поскольку он копирует только часть изображения и делает это с помощью одного вызова функции glTex ... ().