Робота з розширеннями OpenGL з використанням NVIDIA OpenGL SDK 5

Більшість програм для зберігання стислих текстур використовують формат DDS (Direct Draw Surface). Як видно з назви, цей формат призначений для програм, що використовують API DirectDraw та Direct3D. Формат DDS має такі переваги в порівнянні з іншими поширеними форматами: можливість зберігання текстури разом з усіма MipMap-рівнями в одному файлі, можливість збереження 6-ти двовимірних текстур кубічної текстури в одному файлі і, нарешті, підтримка форматів стислих текстур S3TC (DXT1, DXT2 , DXT3, DXT4 та DXT5). Причому, незважаючи на те, що цей формат був розроблений для API DirectX, його можна досить легко "подружити" і з OpenGL.

Існує безліч утиліт для створення DDS файлів: плагіни Photoshop, 3DS MAX і т.д. Для створення DDS файлів для цієї статті я використав утиліту nvdxt, яку можна завантажити або з сайту NVIDIA Developer (http://developer.nvidia.com/) або у складі прикладів з цього сайту (www.gamedev.ru). Хоча ця утиліта і призначена для роботи в командному рядку, їй просто користуватися. Створюючи приклади цієї статті, я використовував команди наступного формату:

Тобто. якщо нам необхідно стиснути файл wood.tga в wood.dds, використовуючи формат DXT5, то можна скористатися командою

Ми розглянемо роботу з файлами формату DDS за допомогою класу CTexture зі складу NVIDIA OpenGL SDK. Звичайно, з файлами формату DDS можна працювати і безпосередньо, як ми зробили з форматом SCI, але це лише ускладнить програму і збільшить ймовірність появи помилок. Але якщо вам все ж таки необхідно працювати з DDS-файлами безпосередньо, то можна порадити подивитися вихідники класу CTexture.

Перед використанням цьогокласу в каталог із проектом програми слід скопіювати файли nv_dds.h і nv_dds.cpp, які знаходяться в каталогах ":\include\shared" та ":\src\shared" відповідно. Після цього перший файл підключається до програми директивою #include, другий - через меню Visual Studio (Project - Add New Item . див. Мал. 5).

робота
Малюнок 5.

Використання цього класу найпростіше показати на прикладі - модифікації програми Ex03 з попередньої частини статті, до якої додано підтримку читання текстур з DDS-файлів (Ex04):

Як видно, робота з файлами DDS здійснюється за допомогою об'єкта класу CDDSImage. Завантаження текстури здійснюється методом load(), який у разі успішного завантаження повертає ненульове значення. Зауважте, що насправді метод load() приймає ще й другий аргумент flipImage, який за умовчанням дорівнює true. Якщо цей параметр дорівнює true, текстура перевертається при завантаженні. Завантажені текстури зберігаються в об'єктах класу CTexture, які знаходяться в полі-векторі images класу CDDSImage, доступ якому можливий і використанням перевантаженого оператора []. Однак, якщо ви не використовуєте кубічні текстури, в полі images буде зберігатися лише одна текстура. Ширина, висота, формат пікселів та розмір текстури зберігаються у полях width, height, format та size відповідно. Покажчик на образ стиснутої текстури зберігається у полі pixels подобъекта image, має клас CSurface, причому доступом до полю pixels то, можливо здійснено з допомогою перевантаженого оператора operator char* класу CTexture, тобто. замість посилання на образ стиснутої текстури можна просто вказувати екземпляр класу CDDSImage.

Якщо DDS-файл містить MipMap-рівні, вони будуть розміщені в об'єктах класу CSurface, які знаходяться в полі-векторіimage відповідних об'єктів класу CTexture. Клас CSurface також має поля width, height, format і size, які аналогічні полям класу CTexture.

Як зазначалося вище, файли формату DDS можуть містити образи стиснутих текстур. Тому реальний додаток повинен спочатку визначити формат пікселів текстури, а потім використовувати команди glTexImage() та glCompressedTexImage() для завантаження відповідно до стислих і стиснених текстур.

Варто також відзначити невелику модифікацію інтерактора консолі glut_console, в яку було додано підтримку історії команд.

Завантаження DDS файлів можна спростити, скориставшись методом upload_texture_2D класу CDDSImage, використання якого продемонстровано в наступному прикладі (Ex05):

Крім того, в цьому прикладі додано підтримку роботи з файлами tga. Це зроблено для точного аналізу втрати якості текстур при S3TC-компресії, т.к. JPG-тектури навіть максимальної якості все одно програють як оригінальні текстури.