Каков предпочтительный способ отображения больших изображений в OpenGL

StackOverflow https://stackoverflow.com/questions/425401

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня пару раз возникала такая проблема.Допустим, я хочу отобразить заставку или что-то еще в контексте 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" класс для идей здесь .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top