Пейзаж стъпка по стъпка
Този урок обхваща основите на техниките за създаване на пейзаж. Аз ще търсене на карта височина, един прост алгоритъм за визуализация, оцветяване (текстуриране) пейзаж, както и оптимизация на ниво на OpenGL. Като например, аз вярвам, че ако по примера на размера (не включва инициализиране OpenGL, и т.н.) повече от 8-10 KB, че е всичко друго, но не и за пример. Така че аз се опитах да следват този принцип.
Представяне на пейзаж, кота карта.
За представяне на ландшафта, ние ще използваме карта височина.
Heights Карта - е двумерен масив на кота терен стойности, в комбинация с определен интервал. Т.е. ние всяка дискретна стойност на X и Y в хоризонталната равнина на намиране на височина.
Графично представяне на масива
Предполагаме, че в примерите светлите области представляват кота, съответно тъмно - низина.
Така че нека да започнем. Както е известно, всяка повърхност може да бъде доста точно представена от триъгълници. Ето защо, всички четири съседни точки на картата на височина на даден правоъгълник, който се раздели на два триъгълника и равенство.
В примера с пейзаж Terrain реализиран като клас. Горният код фрагмент по-долу - част от функцията на терена :: RenderLandscape () показва най-простото изпълнение на процедурата по рисуване.
Оцветяване (текстуриране) пейзаж.
Ще говоря около два начина за попълване на ландшафта (и във втория случай, текстуриране). Това е много кратко обяснение, че не оказва влияние върху много аспекти, като например мулти-текстуриране, смесване, множество текстури и т.н. Всичко това ще напиша отделна статия.
Метод един - интерполация от цветове.
Първият метод е оцветяване на ландшафта е да се използва интерполация цвят. Какво е цвят интерполация, вероятно всеки знае, но ако някой не знае, кратък пример. Например, ако съставянето триъгълник, всеки връх зададете различен цвят, ние получаваме от картинката по-долу. В този случай, се OpenGL извърши интерполация от нас просто искаме да се даде възможност на интерполация, която е проста:
по-долу е кода демонстрира изготвянето триъгълник с интерполирани цвята:
Но да се върнем към пейзажа. За оцветяване, ние отново трябва карта, аз го наричам цветовата карта. Данните за цветни карти са графични файлове по следния начин:
Грубо казано, всеки RGB изображение, запазено като Raw-файл, който може да се използва като цвят на картата. Важно е да се отбележи, че ширината и височината на тези файлове трябва да бъде равна на размера на картата на височина!
Както е известно в режим RGB, една точка на изображението е описана от три байта - стойността на цветни компоненти червено, зелено, синьо. По същия начин на мястото на изображението се съхранява в Raw-файла.
Съхранявайте картата цветове (както и карта на височина) ще бъдат в масива, само един елемент височина карта масив съответства на една стойност на височината, както и картата цветове три стойности - интензитетът на червени, зелени и сини цветове компоненти. Ето защо, ние се въведе следната структура, която ще бъде част от масив от цветове:
При тази процедура рисунка (I отстранен картината "жица" модел) е претърпял незначителни промени:
Метод две - текстура.
Същността на втория метод се прилага към структурата на терена. За това ние трябва текстура, точно същата като на файла за цветен картон, просто го запишете като TGA файл е необходимо (ясно е, че изборът на формата - въпрос на вкус, но TGA-файлове, използвани в примерите от мен). Предполагам, че сте запознат с текстуриране, и аз няма да се опише как да изтеглите и да се създаде структура в OpenGL.
размер на текстурата може да не съответства на размера на картата на височина. Например, за 128x128 височина карта може да бъде избран размер 64x64 текстура или 512x512 пиксела. В последния случай, качеството Бюд по-добре. На практика е достатъчно да изберете размера на текстура, равна на размера на картата на височина.
Методът се състои в текстуриране текстура на всички триъгълници на нашия пейзаж, брои всеки триъгълник, съответстваща на координатите на текстура.
Така че, преди да започнете да текстуриране, ние трябва да определим постепенна промяна в консистенцията координати. Необходимо е да се изчисли стойността на 1.0 / MapSize (MapSize - размер височина карта). И след това се умножи Х и У координатите на триъгълника, за да предприеме тази стъпка, ние получаваме координатите на текстурата, съответстващи на този триъгълник. По-долу е показана диаграмата на процедури текстуриране, рисуване и пример.
Ако искате текстурата не се "разтяга" на целия пейзаж, както и да отговарят на определени части от нея, тя е необходима за изчисляване на терена, отколкото един да замени номера, който искате, и текстурата се повтаря предварително определен брой пъти.
Стъпка промяна на текстурата координати е обявена като константа в Terrain.H.
конст GLfloat TextureBit = 1.0f / (флоат) MapSize;
и да се промени изготвяне процедура е както следва:
Необходимо е да се каже няколко думи за филтриране на текстурите. В горния пример използва линеен филтриране това мнение нама, е най-добрият вариант. Филтриране най-близкия съсед (GL_NEAREST) сериозно увреждат, докато mipmapping почти не се е подобрило. Използването Mipmapping би имало смисъл, ако текстурата е по-голям от размера на ландшафта най-малко два пъти, или ако текстурата се повтаря.
Оптимизиране на OpenGL ниво.
Веднага трябва да се отбележи, че само на ниво OpenGL оптимизация не може да реши проблема на изпълнението като цяло. Разбира се, печалбата за изпълнение не винаги е достатъчно. оптимизация на OpenGL трябва да се използва заедно с оптимален алгоритъм за картографиране на пейзажа. Макар че, ако картата не надвишава 128x128, можете да направите оптимизацията само на ниво OpenGL.
Първо. това, което може да бъде направено от нивото на OpenGL, е да се намали броят на върховете на множествена предава на газопровода текстуриране, че е необходимо да се замени изписването с помощта на еквивалентна GL_TRIANGLE_STRIP GL_TRIANGLE_FAN, както е показано по-долу:
Вярно е, че в примера Използвах GL_TRINGLE_STRIP
На второ място. използва за показване glDrawElements функция. Тази функция ви позволява да се направи набор от примитиви, като се обадите на една функция, като по този начин намаляване на броя на OpenGL извиквания на функции. За да се извърши с изготвянето glDrawElements функция, трябва да изпълни три стъпки:
1. Активирайте масиви с данни, в този случай, множество върхове и текстура координати (по същия начин можете да направите с цветове, нормали и някои други атрибути). За да направите това, използвайте функцията празнотата glEnableClientState (GLenum Array), където като параметър да се уточни GL_VERTEX_ARRAY, а след това GL_TEXTURE_COORD_ARRAY.
2. Настройте параметрите и масиви от данни за съхранение. За да се определи вида масив и изпълнява функцията на върховете
По същия начин, можем да дефинираме масив от текстура координати с помощта на командата
анулира glTexCoordPointer (блясък Размер, GLenum Type, GLsizei крачка);
3. Попълнете масиви от данни и извършване на изобразяване. Както вече споменахме, на чертежа се извършва с помощта на
Режим - ще бъдат изтеглени уточнява коя единица, в този случай GL_TRIANGLE_STRIP (по принцип може да бъде всеки друг). Граф - броят на примитиви. Тип - вида на стойностите на индексите, може да бъде GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT или GL_UNSIGNED_INT. Индекси индекси масива се съхраняват, съгласно който данните ще бъде извлечена от масива на върховете и текстура координати.