Войти
ПрограммированиеСтатьиГрафика

Работа с расширениями 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, что будет просто пустой тратой времени.

Страницы: 1 2 3 4 5 Следующая »

#расширения OpenGL, #NVIDIA, #OpenGL

13 апреля 2003 (Обновление: 6 окт. 2009)