Уроци по OpenGL с ogldev сайт - Урок 25

Skybox - метод, който увеличава визуално сцена, което го прави по-изразителен, чрез създаване на текстура около зрителя, който обгражда камерата на 360 градуса. Текстурата, често е комбинация от небето и терена, като планини, небостъргачи и така нататък. Обикаляйки из околностите играч, той ще види част от Skybox, която запълва празните пикселите не са обхванати от конвенционалните модели. Ето един пример на Skybox Half-Life:







Уроци по OpenGL с ogldev сайт - Урок 25

Идеята за изобразяване на SkyBox в големия куб и зрител настаняване в центъра. При преместване на камерата следва я куб, така че зрителят никога няма да стигнат до "Хоризонт" на сцената. Това е подобно на реалния свят, където можем да видим как облак "пипане" на земя на хоризонта, но тъй като ние се движим напред, на хоризонта се запазва на същото разстояние (в зависимост от терена).

Специален вид на текстури, показани на куб. Тази структура е създадена по такъв начин, че ако той е правилно нарязани и сгънати, а след това неговите граници съвпадат за съставяне един с друг, и за някой, който е вътре в известен смисъл, че текстурата на гласове. Ето, например, тази структура:

Уроци по OpenGL с ogldev сайт - Урок 25

Ако изрежете белите области над текстурата и добавете останалата част по протежение на бели линии, ние получаваме един куб, който да отговаря на нашите изисквания. В OpenGL в тези текстури имат специално име кубически текстура (Cubemap).

За да се вземе проба от текстурата на куб, ние използваме 3D текстура координати вместо 2D, които сме толкова дълго време са използвали. текстура на пробата ще използва тези координати като вектор и първата проверка коя от двете страни 6 включва Texel, а след това я издърпайте от това лице. Процесът може да се види в следната изглед (гледайки надолу върху кутията):

Уроци по OpenGL с ogldev сайт - Урок 25

Селекцията се основава на най-високата част на координатна стойност на текстурата. В примера по-горе, ние виждаме, че Z е най-високата стойност (не можем да видим на Y, но предполагаме, че тя е по-малко от Z). Тъй като Z е положителен знак, че ще се използва линията, в който текстурата е маркирана като "PosZ" и Texel ще бъдат извадени от него (от другата страна - това е NegZ "," PosX "," NegX "," Китка "и" NEGY ").

метод SkyBox също могат да бъдат представени чрез сфера вместо куб. Единствената разлика е, че дължината на вектора във всички възможни посоки е същото (както е радиуса на сферата), докато куба има различна дължина. механизъм за подбор на Texel не се е променило. Skybox, в която вместо на куба - сфера се нарича skydome. Това е, което ще използваме в демото за урока. Трябва да се опитате и двете опции и да изберете най-подходящите.

Този клас включва изпълнението на един кубичен текстура и осигурява лесен интерфейс за неговото сваляне и използване. Конструкторът отнема директория и 6 имена на файлове, които съдържат по стените на куба. За удобство, ние приемаме, че всички файлове са в същата директория. В началото ние трябва да веднъж извикате функцията Load (), която ще изтеглите всички изображения и създаване на обекта текстура OpenGL на. Клас имоти са имената на файловете с изображения (понастоящем написани с пълния път), както и указател към OpenGL обекта текстура. Тази единична показалка дава достъп до всички 6 лицата на текстурата на куб. По време на изпълнението трябва да се нарича Bind () с подходящ модул за текстурата, която да направи модел на разположение за Shader.







Функция, която се зарежда текстурата започва с генерирането на текстурата на обекта. Тази задача се възлага на специален маркер GL_TEXTURE_CUBE_MAP. След това влезе в една линия, която съдържа изброяване GL, който е част от кубична текстура (GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X и т.н.). Тази оферта е същата като вектор ред "m_fileNames", която опростява цикъла. Зарежда се файлове с изображения едно по едно, а след това чрез ImageMagick, посочени в OpenGL чрез glTexImage2D (). Имайте предвид, че всеки призив за тази функция се осъществява чрез съответната GL Enum за тази страна (това е как трябва да бъдат едни и същи много решетки "типове" и "m_fileNames"). След текстура куб е зареден и изпълнен задаваме някои знамена. Вече трябва да е запознат с всички тях, с изключение на GL_TEXTURE_WRAP_R. Тази оферта просто означава използването на 3-измерни координати на текстурата. За всички тях добавихме Режим на компресия.

Тази функция трябва да се извика, преди да използвате текстура да привлече Skybox. Текстурата ще бъде прикрепен към GL_TEXTURE_CUBE_MAP, сме използвали тази стойност в (функцията за зареждане).

За да се направи Skybox ще използва собствения си метод. Той разполага с набор от качества, които трябва да се посочи чрез предизвикателства - WVP матрица за конвертиране на кубчета или в една сфера и текстура, която ще се прилага. Нека да погледнем вътре в клас.

Този връх шейдъри за Skybox. Това е доста проста, но трябва да се обърне внимание на някои трикове. Първият трик, че ние се превърне вход векторни позиции както обикновено чрез WVP матрицата, но след това във вектора, който се прехвърля към Shader на фрагмент, ние замени на Z координира W. След края на връх шейдъри растеризатора на приема gl_Position вектор и вектора генериране перспективи участък (участък от W), за да се заключи, че издатината. Когато зададете Z в W, и ние гарантираме, че крайната позиция на стойност Z ще бъде равна на 1,0. Това означава, че Skybox винаги ще се изплъзне от дълбочина за изпитване, различни модели на сцената. Така SkyBox винаги ще бъде на фона на всичко, което е на сцената, това е точно това, което искахме.

Вторият трик е, че ние използваме първоначалните позиции в местната област като 3D координати на текстурата. Тя работи, поради факта, че изборът на пробата в кубична структура прилича на вектор от центъра до точка на куба или сфера. Поради това, позицията на точката става координатите на текстурата. Vertex Shader предава местните координатите на всеки връх като координатите на текстурата (8 върховете на куба и много повече за сферата), тогава те ще се определят чрез интерполация за всеки пиксел растеризатора. Това ще ни даде пиксел, които можем да използваме, за вземане на проби.

Фрагмент шейдър безкрайно проста. Всичко, което правим, е да използвате "samplerCube" вместо "sampler2D", за да получите достъп до структурата на куб.

Skybox клас включва няколко различни елементи - метода, кубичната текстура и модел на сфера или куб. За да се опрости използването му, този клас включва всички елементи, които са необходими за правилното му употреба в себе си. Веднъж той инициализира в началото с директора и имената на кубичен текстура файл и след това се използва по време на изпълнение чрез функцията за Render (). Единствената функция разговор се грижи за всичко. Имайте предвид, че в допълнение към компонентите, посочени в същия клас има достъп до камерата и стойностите за проекцията на перспектива (FOV, Z и разделителната способност на екрана). Той е необходим за правилното попълване на газопровод конвейер например клас.

Първото нещо, което ще се промени е да се откажа от режима. Обикновено ние отхвърляме повърхност, която е противоположна на посоката на камерата, и в този случай камерата е вътре в кутията, така че ние искаме да ги видите в предната, а не назад. Проблемът е, че в областта на общата модел, който се използва тук, е посоката на триъгълници, а отвътре е необходимо (в зависимост от реда на върха е посочено). Ние може или да се промени модела или обратно на посоката на режим отпадане. Предпочитаме последната опция, така че един и същ модел сфера може да се използва и в други ситуации. Ето защо, ние кажа OpenGL да изхвърли предната част на триъгълници.

Следващото нещо, което прави тази функция - това изчисление WVP матрица. Имайте предвид, че водеща позиция на световния SkyBox е настроен на камерата. Това ще запази стабилно състояние в центъра на някой от нейните позиции. Веднъж прикрепен към единица куб текстура 0 (този модул вече е конфигуриран при създаването SkyboxTechnique в SkyBox :: Init ()). След направен сфера меша. И накрая, първоначалните стойности се връщат боклук и дълбочина тест.

Полезно за изпълнение борда винаги ще направи Skybox най-малко (след като всички други модели). Причината е, че ние знаем, че той винаги ще бъде зад други обекти в сцената. Някои графични процесори (графичен процесор) имат механизъм за оптимизация, която се състои в това, че Shader на фрагмент няма да се нарича, ако един пиксел губи дълбочина тест. Това е много полезно в ситуации с SkyBox като Shader на фрагмент се прави само за останалата част от фоновите пикселите, които не са обхванати от други модели. Но това изисква дълбочина буфер е пълен, ще получите след извършването на други модели.