2017-02-22 31 views
0

У меня есть часть GLvoid* data, которая содержит полное изображение, которое периодически обновляется во всей моей программе. Я использую glTexImage2D для инициализации текстуры на графическом процессоре с этими данными.Должен ли я предоставить полное или частичное изображение glTexSubImage2D?

Я хотел бы использовать glTexSubImage2D для обновления частей текстуры по мере необходимости. documentation for glTexSubImage2D описывает GLvoid* pixels аргумент, как, например:

Определяет указатель на данные изображения в памяти.

Какие «данные изображения» ожидаются? Могу ли я предоставить весь файл GLvoid* data или он ожидает буфер, который только содержит копировавшие данные?

Если он ожидает частичные данные, существует ли альтернативный способ предоставления всего буфера?

+0

Это наоборот: 'glTexSubImage2D' не используется для обновления части текстуры в памяти графического процессора, она используется для загрузки части буфера данных изображения в память графического процессора. – Steeve

+0

Может ли glPixelStore GL_PACK_ROW_LENGTH решить проблему? (и в меньшей степени GL_PACK_SKIP_PIXELS и GL_PACK_SKIP_ROWS). Не выкопали слишком глубоко, поэтому комментарий, а не ответ. – Columbo

ответ

3

Это только данные, которые будут скопированы. Или вам придется тратить много памяти на загрузку только части изображения (иногда это единственная часть, которую вы сейчас имеете).

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

+0

Как упоминалось в комментариях к вопросу, будет ли 'glPixelStore' какая-нибудь помощь здесь? Нельзя ли его использовать для продвижения данных? – Litty

+0

@ Litty Кажется возможным, но я никогда не пробовал это. – BlueWanderer

0

Вы можете предоставить все данные изображения с вызовом

glTexSubImage2D(target, level, 0, 0, W, H, format, type, pixels); 

W и Н ширина и высота текстуры, вся текстура будет скопирована, пиксели являются W * H массива. Или вы можете предоставить только измененные данные с вызовом

glTexSubImage2D(target, level, offset_x, offset_y, w, h, format, type, pixels); 

где ш и ч является Weigth и высотой измененных данных, так offset_x + ж < W и offset_y + у < Y. пикселей составляет W * H массива.

Edit:

glPixelStorei(GL_UNPACK_ROW_LENGTH, W); 
glPixelStorei(GL_UNPACK_SKIP_PIXELS, offset_x); 
glPixelStorei(GL_UNPACK_SKIP_ROWS, offset_y); 

glTexSubImage2D(target, level, offset_x, offset_y, w, h, format, type, pixels); 

где пикселей является W * H

+0

В последнем примере «пиксели» должны содержать только измененные данные? Есть ли способ передать все изображение вместо этого, и пусть эта функция «вишня-выбор» измененных данных? – Litty

+0

Да. Во втором примере пиксели содержат только измененные данные с размером w * h, w <= W и h <= H. Вы можете передать все изображение с помощью [glPixelStoref] (https://www.khronos.org/opengl/wiki/GLAPI/glPixelStore) –

+0

GL_UNPACK_SKIP_PIXELS и GL_UNPACK_SKIP_ROWS помогут, но вам все равно нужно позвонить glTexSubImage2D –