Какой предпочтительный способ показать большие изображения в OpenGL - PullRequest
6 голосов
/ 08 января 2009

У меня была эта проблема пару раз. Допустим, я хочу отобразить заставку или что-то в контексте OpenGL (или DirectX в этом отношении, это скорее концептуальная вещь), теперь я мог бы просто загрузить текстуру 2048x2048 и надеяться, что видеокарта справится с этим. это (большинство будет в настоящее время, я полагаю), но с ростом видеокарты старой школы у меня есть эта дурная совесть, склоняющаяся ко мне и говорящая мне, что я не должен использовать текстуры такого большого размера.

Какой предпочтительный способ сегодня? Это просто втиснуть эту вещь в видеопамять, разбить ее на мозаику или позволить процессору делать работу и glDrawPixels? Или что-то более сложное?

Ответы [ 2 ]

10 голосов
/ 08 января 2009

Если это однокадровое заставочное изображение без анимации, то использование 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 GL_PACK_ROW_LENGTH для загрузки фрагментов большого изображения в текстуру.
  • Изменение размера изображения : измените размер изображения в соответствии с максимальным поддерживаемым размером текстуры. Для этого есть даже вспомогательная функция GLU, gluScaleImage .
0 голосов
/ 08 января 2009

Я не думаю, что есть встроенная функция opengl, но вы можете найти библиотеку (или написать функцию самостоятельно), чтобы разбить изображение на более мелкие куски, а затем распечатать, чтобы отобразить меньшие куски (фрагменты 128x128 или аналогичный).

У меня возникла проблема с использованием Slick2D для Java-игры. Вы можете проверить их класс "BigImage" для идей здесь .

...