Работа с расширениями OpenGL с использованием NVIDIA OpenGL SDK 5.1. (Часть 6) (3 стр)
Автор: Сергей Гайдуков
Расширение ARB_texture_compression
В OpenGL работа со сжатыми текстурами осуществляется с использованием расширения ARB_texture_compression. Для сжатия текстуры при загрузке в видеопамять достаточно указать в качестве внутреннего формата текстуры константы GL_COMPRESSED_RGB_ARB или GL_COMPRESSED_RGBA_ARB. Первая константа используется, когда мы не используем альфа канал, а вторая - если используем. После этого драйвер OpenGL сам выбирает оптимальный (с его точки зрения) внутренний формат для загружаемой текстуры (Как мне показалось, при использовании константы GL_COMPRESSED_RGB_ARB и GL_COMPRESSED_RGBA_ARB мой GeForce2 MX 32MB всегда устанавливал форматы сжатия GL_COMPRESSED_RGB_S3TC_DXT1_EXT и GL_COMPRESSED_RGBA_S3TC_DXT5_EXT соответственно). Если же видеокарта не может сжать данную текстуру, то в первом случае будет установлен формат текстур GL_RGB, а во втором — GL_RGBA.
Для того чтобы добавить поддержку сжатых текстур в пример Ex01 нам достаточно только немного модифицировать glTexImage2D() (Ex02):
glTexImage2D(texture0.target, 0, GL_COMPRESSED_RGB_ARB, textureImage0.width, textureImage0.height, 0, textureImage0.format, GL_UNSIGNED_BYTE, textureImage0.pixels);
Для проверки того, что текстура была корректно сжата, используется команда glGetTexLevelParameteriv с параметром GL_TEXTURE_COMPRESSED_ARB. Если она возвратила ненулевое значение, то сжатие прошло успешно, в противном случае произошла ошибка:
int compressed; glGetTexLevelParameteriv(texture0.target,0,GL_TEXTURE_COMPRESSED_ARB,&compressed); if ( compressed) console.add( "Texture has been properly compressed"); else console.add( "Texture has not been compressed");
Расширение EXT_texture_compression_s3tc
Как указывалось выше, расширение ARB_texture_compression самостоятельно выбирает подходящий формат сжатия для текстуры. Но, как известно, не существует формата сжатия, который бы одновременно обладал максимальной скоростью и качеством, и минимальным размером текстуры. Поэтому иногда программисту необходима возможность ручного выбора формата сжатия текстур. Кроме того, на NVIDIA видеокартах расширение ARB_texture_compression является лишь настройкой над расширением EXT_texture_compression_s3tc, поэтому знание расширения очень вам пригодится при создании эффективных программ.
Все NVIDIA видеокарты, начиная с GeForce256, поддерживают технологию текстурного сжатия S3 Texture Compression (S3TC). Непосредственная работа с текстурами этого формата осуществляется с использованием расширения EXT_texture_compression_s3tc. В настоящее время это расширение поддерживает 4 формата текстур, указанные в таблице 2.
| Формат текстуры | Поддержка альфа канала | Степень сжатия |
| GL_COMPRESS_RGB_S3TC_DXT1_EXT | Нет | 6:1 |
| GL_COMPRESS_RGBA_S3TC_DXT1_EXT | Да (1-бит) | 8:1 |
| GL_COMPRESS_RGBA_S3TC_DXT3_EXT | Да (4-бита) | 4:1 |
| GL_COMPRESS_RGBA_S3TC_DXT5_EXT | Да (3-бита с интерполяцией) | 4:1 |
Таблица 2 - Форматы текстур, поддерживаемые расширением EXT_texture_compression_s3tc
Возможно, вы уже заметили, что расширение EXT_texture_compression_s3tc не поддерживает форматы текстур DXT2 и DXT4, имеющиеся в DirectX. Это связано с тем, что эти форматы не имеют несжатых аналогов в OpenGL. Следовательно, их добавление потребует введения нового несжатого формата текстур RGBA_PREMULTIPLIED_ALPHA, что будет просто пустой тратой времени.
#расширения OpenGL, #NVIDIA, #OpenGL
13 апреля 2003 (Обновление: 6 окт 2009)