Каков предпочтительный способ отображения больших изображений в OpenGL
Вопрос
У меня пару раз возникала такая проблема.Допустим, я хочу отобразить заставку или что-то еще в контексте OpenGL (или DirectX, если уж на то пошло, это скорее концептуальная вещь), теперь я мог бы просто загрузить текстуру 2048x2048 и надеяться, что видеокарта справится с этим (полагаю, большинство справится в наше время), но, поскольку я использую видеокарты старой школы, меня мучает совесть и говорит, что я не должен использовать текстуры такого размера.
Какой способ является предпочтительным в настоящее время?Нужно ли просто втиснуть эту штуку в видеопамять, разбить ее на плитки или позволить процессору выполнять всю работу и glDrawPixels?Или что-то более сложное?
Решение
Если это однокадровое заставочное изображение без анимации, то нет никакого вреда в использовании glDrawPixels
.Если производительность имеет решающее значение и от вас требуется использовать текстуру, то правильный способ сделать это - определить во время выполнения максимальный поддерживаемый размер текстуры с помощью прокси-текстуры.
GLint width = 0;
while ( 0 == width ) { /* use a better condition to prevent possible endless loop */
glTexImage2D(GL_PROXY_TEXTURE_2D,
0, /* mip map level */
GL_RGBA, /* internal format */
desiredWidth, /* width of image */
desiredHeight, /* height of image */
0, /* texture border */
GL_RGBA /* pixel data format, */
GL_UNSIGNED_BYTE, /* pixel data type */
NULL /* null pointer because this a proxy texture */
);
/* the queried width will NOT be 0, if the texture format is supported */
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
desiredWidth /= 2; desiredHeight /= 2;
}
Как только вы узнаете максимальный размер текстуры, поддерживаемый системным драйвером OpenGL, у вас будет как минимум два варианта, если ваше изображение не подходит:
- Нанесение плитки на изображение:используйте несколько квадратур после разделения изображения на более мелкие поддерживаемые фрагменты.Разбиение изображений на плитки для чего-то вроде заставки не должно быть слишком сложным.Вы можете использовать glPixelStorei ( Пиксельный магазин )'s
GL_PACK_ROW_LENGTH
параметр для загрузки фрагментов увеличенного изображения в текстуру. - Изменение размера изображения:измените размер вашего изображения, чтобы оно соответствовало максимальному поддерживаемому размеру текстуры.Есть даже вспомогательная функция GLU, которая сделает это за вас, Изображение gluScaleImage.
Другие советы
Я не думаю, что есть встроенная функция opengl, но вы можете найти библиотеку (или написать функцию самостоятельно), чтобы разбить изображение на более мелкие куски, а затем распечатать, чтобы отобразить меньшие куски (плитки размером 128x128 или аналогичный). р>
У меня были проблемы с этим при использовании Slick2D для игры на Java. Вы можете проверить их "BigImage" класс для идей здесь . р>