Если это однокадровое заставочное изображение без анимации, то использование 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 .