Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с большими изображениями в OpenGL

289
30 ноября 2010 года
Jeyson
207 / / 20.04.2000
Доброго времени суток.
Пишу приложение под OpenGL.
Сейчас стоит задача загрузки фоновой картинки большого размера примерно 10000х10000 (карта города) пишет что памяти не хватает или ничего не пишет, просто белая текстура. Пока выхожу из положения так. В фотошопе режу эту картинку на несколько частей. получаю примерно размеры 2000х2000. Потом рисую плоскость на которую натягиваю текстуру в виде одной картинки. Но это лишь часть города.
Цель: создание заднего фона в виде картинки любого размера. Картинка должна уметь изменять свои размеры на заданные пользователем (высота/ширина) а также приближаться и отдаляться при работе пользователя. Такое реализовано в фотошопе и многих других прогах. Даже в билдере С++ компонента TImage может грузить картинки любого размера.
Как это сделать?
Буду очень рад исходнику.
Спасибо.
6.0K
30 ноября 2010 года
artyom-tyanutov
107 / / 10.07.2006
1) glGetIntegerv() + GL_MAX_TEXTURE_SIZE;
2) Размеры текстуры должны быть степенью двойки (хотя карты, если правильно помню, выше GF6XXX, умеют npot (GL_ARB_texture_non_power_of_two)).
289
07 декабря 2010 года
Jeyson
207 / / 20.04.2000
Я так понимаю, что эта команда лишь позволяет определить максимальный размер текстуры. (OGL плотно занялся недавно). А если текстура заведомо большая 20000х20000 например, как с этим бороться? даже если она и загрузится, то работать будет очень тормозно. Как быть?
И еще вопрос: пишу под билдер. Как грамотно управлять камерой с помощью мыши? 1.Приближение, отдаление, 2. поворот, 3. панарамирование. Использовать нужно ортографическую проекцию, ибо только в ней можно осуществлять выбор объектов. Если можно киньте исходник или алгоритм для чайников.
Спасибо.
6.0K
07 декабря 2010 года
artyom-tyanutov
107 / / 10.07.2006
Цитата: Jeyson
Я так понимаю, что эта команда лишь позволяет определить максимальный размер текстуры. (OGL плотно занялся недавно).


Да, именно так.

Цитата: Jeyson
А если текстура заведомо большая 20000х20000 например, как с этим бороться? даже если она и загрузится, то работать будет очень тормозно. Как быть?


Не использовать такие текстуры, это ограничение видеокарты. Разбивай текстуру на куски.

Цитата: Jeyson
И еще вопрос: пишу под билдер. Как грамотно управлять камерой с помощью мыши? 1.Приближение, отдаление, 2. поворот, 3. панарамирование.


Напиши свой класс камеры, который делает то что тебе нужно. Например http://pmg.org.ru/nehe/nehe_camera.htm

Цитата: Jeyson
Использовать нужно ортографическую проекцию, ибо только в ней можно осуществлять выбор объектов.


Что значит выбор только в орто? Взгляни на /*первое что пришло в голову*/ Blender3d - выбор объектов в 3D сцене в любой проекции, в нём используется OpenGL.

289
08 декабря 2010 года
Jeyson
207 / / 20.04.2000
спасибо за урок NeHe - что-то я это упустил
С моей стороны будет наглостью, но все же нельзя ли по-подробнее про разбивку изображения на части?
спасибо
6.0K
08 декабря 2010 года
artyom-tyanutov
107 / / 10.07.2006
Разбей своё изображение на куски со сторонами <= GL_MAX_TEXTURE_SIZE, загони в n текстур, передай их все в шейдер ну и исходя из текстурных координат вычисляй нужный кусок, например.
289
21 декабря 2010 года
Jeyson
207 / / 20.04.2000
Все-таки вопрос про большие изображения открыт. Еще раз что мне требуется:
1. Имеем карту bmp скажем 10000х10000.
2. При загрузке ее на большом удалении она должна вся загрузиться но с очень плохим качеством.
3. При приближении камеры должен хорошо отрисовываться кусок, попавший на экран.
4. Картинка должна натягиваться на прямоугольник с определенными размерами (размер текстуры очень важен ибо это карта)


Очень хорошим примером служит ACDS. Грузит большие картинки. При приближении изображения тормозов не возникает, оно лишь на секунду мутное, но потом качество улучшается. Как это реализовать?

Хотя бы направление работы. А лучше наброски кода или бросьте в меня алгоритмом действий.
Спасибо.
PS шейдеры не юзал (неужели они - решение моего вопроса)
6.0K
21 декабря 2010 года
artyom-tyanutov
107 / / 10.07.2006
Еще один вариант, даже может быть более предпочтительный - кури про "megatexture" - думаю можно реализовать нечто подобное (например статья есть тут http://www.gamedev.ru/code/articles/Megatexture)
289
22 декабря 2010 года
Jeyson
207 / / 20.04.2000
Спасибо за ссылочку. Смотрел, круто... это уже профи работают.
Меня посетила мысль которую прошу прокоментировать.
Имеем большую текстуру 10000Х10000.
С помощью фотошопа режу ее на 100 частей 1000х1000.
А потом каждую часть "натягиваю" на прямоугольник (их тоже сотня). Составляю их вместе и получаю как бы целую картинку. Затраты времени при загрузке естественно будут (в ссылочке тоже идет компиляция рисунка). Вопрос: такой расклад возможен? Скорость работы в последствии будет эквивалентна скорости работы с одной картинкой 1000х1000. Возможно ли эти 100 картинок загрузить в память (в массив из 100 текстур)?
Спасибо.
6.0K
22 декабря 2010 года
artyom-tyanutov
107 / / 10.07.2006
Можно и так, только видеопамяти для этого тебе нужно будет 10000 * 10000 * 3 (RGB) = 286.1 Mb без учета мипмапов.
6.0K
28 декабря 2010 года
artyom-tyanutov
107 / / 10.07.2006
Ну, моё мнение что если хватает видеопамяти - разбей текстуру так чтобы куски были <= GL_MAX_TEXTURE_SIZE (если есть расширение GL_ARB_texture_non_power_of_two - то соответственно даже без соблюдения степени двойки) и выводи кучу квадов с ними.
Иначе делай что-то вроде мегатекстуры.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог