Задача: заместить блок данных (но не текстуру целиком) в текстуре новым блоком данных с минимальными временными затратами.
Дано : текстурный массив; блок новых данных
Работающий вариант:
glTexSubImage3D ( GL_TEXTURE_2D_ARRAY_EXT, 0, ox, oy, level, w, h, 1, format /*GL_BGR*/, dataType /*GL_UNSIGNED_BYTE*/, buffer );
Вариант, который должен (в теории, естественно) работать:
// создаем пиксельный буфер glGenBuffers ( 1, &pbo ); glBindBuffer ( GL_PIXEL_UNPACK_BUFFER, pbo ); // ставим его на постянное обновление приложением glBufferData ( GL_PIXEL_UNPACK_BUFFER, textureWidth * textureHeight * bpp, 0, GL_DYNAMIC_DRAW ); glBindBuffer ( GL_PIXEL_UNPACK_BUFFER, 0 ); // ... // процесс обновления glBindBuffer ( GL_PIXEL_UNPACK_BUFFER, pbo ); // bpp == 1, 3, 4 (то есть показывает именно БАЙТЫ, а не биты) int offset = ( ox + textureWidth * oy ) * bpp; glBufferSubData ( GL_PIXEL_UNPACK_BUFFER, offset, h * w * bpp, buffer ); // сообственно, официальная дока ОГЛ утверждает, что в последнем параметре при включенном // пиксельном буфере необходимо указывать смещение в этом самом буфере, с которого и будет // считан блок данных размером (ox, oy, w, h). glTexSubImage3D ( GL_TEXTURE_2D_ARRAY_EXT, 0, ox, oy, 0, w, h, 1, format /*GL_BGR*/, dataType /*GL_UNSIGNED_BYTE*/, &offset ); glBindBuffer ( GL_PIXEL_UNPACK_BUFFER, 0 );
Вопрос: почему возникает ошибка INVALID_OPERATION, когда offset > 0?
Примечание: При этом, если вместо смещения выставить ноль, то процесс обновления вроде как происходит.
Если же загрузить текстурные данные для всей текстуры целиком, то все работает нормально (в этом случае
смещение естественно оказывается равным нулю). Фиаско наступает и в случае использования map/unmap
директив!
Отредактировано stea1th (2009-01-16 15:27:02)