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

Повечето програми за съхранение на компресирани текстури използват DDS (Direct Draw Surface) формат. Както подсказва името, този формат е предназначен за приложения, които използват DirectDraw и Direct3D API. Форматът DDS има следните предимства пред други често срещани формати: възможност за съхраняване на текстура заедно с всички нива на MipMap в един файл, възможност за запазване на 6 двуизмерни текстури на кубична текстура в един файл и, накрая, поддръжка за S3TC компресирани текстурни формати (DXT1, DXT2, DXT3, DXT4 и DXT5). Освен това, въпреки факта, че този формат е разработен за DirectX API, той може лесно да бъде "приятел" с OpenGL.

Има много помощни програми за създаване на DDS файлове: добавки за Photoshop, 3DS MAX и др. За да създам DDS файлове за тази статия, използвах помощната програма nvdxt, която може да бъде изтеглена от уебсайта за разработчици на NVIDIA (http://developer.nvidia.com/) или като част от примерите от този уебсайт (www.gamedev.ru). Въпреки че тази помощна програма е проектирана да работи от командния ред, тя е много лесна за използване. Когато създавах примерите за тази статия, използвах команди със следния формат:

Тези. ако трябва да компресираме файла wood.tga в wood.dds с помощта на формата DXT5, тогава можем да използваме командата

Ще разгледаме работата с DDS файлове с помощта на класа CTexture от NVIDIA OpenGL SDK. Разбира се, можете да работите директно с DDS файлове, както направихме с SCI формата, но това само ще усложни програмата и ще увеличи вероятността от грешки. Но ако все още трябва да работите директно с DDS файлове, тогава можем да ви посъветваме да погледнете изходния код на класа CTexture.

Преди да използвате товаclass в директорията с проекта на програмата, копирайте файловете nv_dds.h и nv_dds.cpp, които се намират съответно в директориите ":\include\shared" и ":\src\shared". След това първият файл се свързва към програмата с директивата #include, вторият - чрез менюто на Visual Studio (Проект -> Добавяне на нов елемент . вижте фиг. 5).

разширения
Снимка 5.

Използването на този клас е най-лесно да се покаже чрез пример - модификация на програмата Ex03 от предишната част на статията, която добави поддръжка за четене на текстури от DDS файлове (Ex04):

Както можете да видите, работата с DDS файлове се извършва с помощта на обект от класа CDDSImage. Текстурата се зарежда с помощта на метода load(), който връща ненулева стойност в случай на успешно зареждане. Имайте предвид, че методът load() всъщност приема втори аргумент flipImage, който по подразбиране е true. Ако този параметър е верен, тогава текстурата се обръща при зареждане. Заредените текстури се съхраняват в обекти от класа CTexture, които се намират във векторното поле на изображенията на класа CDDSImage, което може да бъде достъпно чрез претоварения оператор []. Ако обаче не използвате кубични текстури, само една текстура ще бъде съхранена в полето за изображения. Ширината, височината, форматът на пикселите и размерът на текстурата се съхраняват съответно в полетата за ширина, височина, формат и размер. Указателят към изображението на компресираната текстура се съхранява в полето за пиксели на подобекта на изображението на класа CSurface и полето за пиксели може да бъде достъпно с помощта на претоварения оператор char* оператор на класа CTexture, т.е. вместо да препращате към изображение на компресирана текстура, можете просто да посочите екземпляр на класа CDDSImage.

Ако DDS файлът съдържа нива на MipMap, те ще бъдат поставени в обекти от класа CSurface, които са във векторното полеизображение на съответните обекти от класа CTexture. Класът CSurface също има полета ширина, височина, формат и размер, които са подобни на полетата на класа CTexture.

Както бе споменато по-горе, DDS файловете могат също да съдържат некомпресирани текстурни изображения. Следователно реалното приложение трябва първо да определи пикселния формат на текстурата и след това да използва командите glTexImage() и glCompressedTexImage(), за да зареди съответно некомпресирани и компресирани текстури.

Заслужава да се отбележи и малка модификация на интерактора на конзолата glut_console, в която е добавена поддръжка за история на командите.

Качването на DDS файлове може да бъде допълнително опростено чрез използване на метода upload_texture_2D на класа CDDSImage, чиято употреба е демонстрирана в следния пример (Ex05):

Освен това към този пример е добавена поддръжка за работа с tga файлове. Това беше направено, за да се анализира по-точно загубата на качество на текстурата по време на S3TC компресия. JPG текстурите дори с най-високо качество все още губят качество спрямо оригиналните текстури.