Работа с большими изображениями в OpenGL
Пишу приложение под OpenGL.
Сейчас стоит задача загрузки фоновой картинки большого размера примерно 10000х10000 (карта города) пишет что памяти не хватает или ничего не пишет, просто белая текстура. Пока выхожу из положения так. В фотошопе режу эту картинку на несколько частей. получаю примерно размеры 2000х2000. Потом рисую плоскость на которую натягиваю текстуру в виде одной картинки. Но это лишь часть города.
Цель: создание заднего фона в виде картинки любого размера. Картинка должна уметь изменять свои размеры на заданные пользователем (высота/ширина) а также приближаться и отдаляться при работе пользователя. Такое реализовано в фотошопе и многих других прогах. Даже в билдере С++ компонента TImage может грузить картинки любого размера.
Как это сделать?
Буду очень рад исходнику.
Спасибо.
2) Размеры текстуры должны быть степенью двойки (хотя карты, если правильно помню, выше GF6XXX, умеют npot (GL_ARB_texture_non_power_of_two)).
И еще вопрос: пишу под билдер. Как грамотно управлять камерой с помощью мыши? 1.Приближение, отдаление, 2. поворот, 3. панарамирование. Использовать нужно ортографическую проекцию, ибо только в ней можно осуществлять выбор объектов. Если можно киньте исходник или алгоритм для чайников.
Спасибо.
Цитата: Jeyson
Я так понимаю, что эта команда лишь позволяет определить максимальный размер текстуры. (OGL плотно занялся недавно).
Да, именно так.
Цитата: Jeyson
А если текстура заведомо большая 20000х20000 например, как с этим бороться? даже если она и загрузится, то работать будет очень тормозно. Как быть?
Не использовать такие текстуры, это ограничение видеокарты. Разбивай текстуру на куски.
Цитата: Jeyson
И еще вопрос: пишу под билдер. Как грамотно управлять камерой с помощью мыши? 1.Приближение, отдаление, 2. поворот, 3. панарамирование.
Напиши свой класс камеры, который делает то что тебе нужно. Например http://pmg.org.ru/nehe/nehe_camera.htm
Цитата: Jeyson
Использовать нужно ортографическую проекцию, ибо только в ней можно осуществлять выбор объектов.
Что значит выбор только в орто? Взгляни на /*первое что пришло в голову*/ Blender3d - выбор объектов в 3D сцене в любой проекции, в нём используется OpenGL.
С моей стороны будет наглостью, но все же нельзя ли по-подробнее про разбивку изображения на части?
спасибо
Разбей своё изображение на куски со сторонами <= GL_MAX_TEXTURE_SIZE, загони в n текстур, передай их все в шейдер ну и исходя из текстурных координат вычисляй нужный кусок, например.
1. Имеем карту bmp скажем 10000х10000.
2. При загрузке ее на большом удалении она должна вся загрузиться но с очень плохим качеством.
3. При приближении камеры должен хорошо отрисовываться кусок, попавший на экран.
4. Картинка должна натягиваться на прямоугольник с определенными размерами (размер текстуры очень важен ибо это карта)
Очень хорошим примером служит ACDS. Грузит большие картинки. При приближении изображения тормозов не возникает, оно лишь на секунду мутное, но потом качество улучшается. Как это реализовать?
Хотя бы направление работы. А лучше наброски кода или бросьте в меня алгоритмом действий.
Спасибо.
PS шейдеры не юзал (неужели они - решение моего вопроса)
Еще один вариант, даже может быть более предпочтительный - кури про "megatexture" - думаю можно реализовать нечто подобное (например статья есть тут
Меня посетила мысль которую прошу прокоментировать.
Имеем большую текстуру 10000Х10000.
С помощью фотошопа режу ее на 100 частей 1000х1000.
А потом каждую часть "натягиваю" на прямоугольник (их тоже сотня). Составляю их вместе и получаю как бы целую картинку. Затраты времени при загрузке естественно будут (в ссылочке тоже идет компиляция рисунка). Вопрос: такой расклад возможен? Скорость работы в последствии будет эквивалентна скорости работы с одной картинкой 1000х1000. Возможно ли эти 100 картинок загрузить в память (в массив из 100 текстур)?
Спасибо.
Можно и так, только видеопамяти для этого тебе нужно будет 10000 * 10000 * 3 (RGB) = 286.1 Mb без учета мипмапов.
Иначе делай что-то вроде мегатекстуры.