Использование libpng для «разделения» изображения на сегменты - PullRequest
2 голосов
/ 26 января 2011

Я пытаюсь использовать libpng, чтобы разделить изображение на несколько частей. Причина в том, что я не могу загрузить текстуру размером более 512x512 на аппаратном обеспечении, над которым я сейчас работаю. Я достиг этого раньше со смесью SDL и SDL_Image. Я в основном использовал аргумент srcrect в SDL_BlitSurface, чтобы скопировать только часть изображения, которую я затем преобразовал в текстуру OpenGL. Объединяя это с простым циклом по горизонтали, а затем по вертикали, я смог получить массив текстур, каждая из которых максимально 512x512. Тогда это был просто вопрос отрисовки их в правильном положении.

Прямо сейчас, я не могу позволить себе роскошь использования SDL, поэтому я решил, что можно сделать это непосредственно самому с помощью libpng. Основываясь на некотором поиске, я думаю, что это просто вопрос использования png_read_rows, чтобы прочитать, какие именно части мне нужны. Но вот где я застрял, я не совсем уверен, как это сделать.

Кроме того, если вам интересно, почему я не просто делю изображения в gimp / photoshop / paint или где-либо еще, это потому, что я не контролирую их и загружаю их во время выполнения.

Заранее спасибо за помощь.

1 Ответ

4 голосов
/ 26 января 2011

Вам не нужно возиться с извлечением плитки. Вы можете указать OpenGL просто использовать некоторую часть данных, которые вы ей даете, для инициализации текстуры. Ключевое слово - параметры glPixelStorei (GL_UNPACK ...). Скажем, ваше входное изображение имеет размеры img.width и img.height, а RGB-пиксель имеет 4 байта, то есть один байтовый отступ для каждого пикселя, а ваше субизображение определяется как subimg.off_x, subimg.off_y, subimg.width, subimg.height. Тогда вы можете загрузить его так:

glPixelStorei(GL_UNPACK_ROW_LENGTH, img.width)
glPixelStorei(GL_UNPACK_SKIP_PIXELS, subimg.off_x)
glPixelStorei(GL_UNPACK_SKIP_ROWS, subimg.off_y)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexImage2D(GL_TEXTURE_2D, GL_RGB, 0,
             subimg.width, subimg.height, 0,
             GL_RGBA, GL_UNSIGNED_BYTE, pixeldata)
...