ПредишенСледващото

5.1 Общи думи

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

5.2 Работа със снимки

Има много графични формати - BMP, PCX, GIF, JPEG и др. OpenGL не подкрепи директно не е един от тях. В OpenGL, няма четене / запис на файлове с изображения функции. Но поддържа от работа с масиви от пиксели. Можете да качите файла с изображение с помощта на трета страна, библиотека, в памет и работи с тях средства за OpenGL. В масив от пиксели данни могат да бъдат разположени по различни начини: RGB, BGR, RGBA; не могат да присъстват всички компоненти; всеки елемент на масива могат да заемат един байт, два, четири или осем; привеждане в съответствие може да бъде един байт, дума или двойна дума. Като цяло, графично представяне на местоположението на формати за данни много в ума. Аз гледам на един от тях, най-често използваният, мисля. Информация за всеки пиксел се съхранява в RGB формат и заема три байта подредба на байтове. Спомагателните библиотека е функция auxDIBImageLoad (LPCSTR), който се зарежда в паметта на BMP-файл и връща указател към структура:

За простота ще използвам тази функция. Сред придружаващите програми ще намерите моята програма за изтегляне на файлове от формати, PCX. В изходния код на тази програма напълно преносим и да е платформа компилатор с ANSI C.

Преди да се обадите функция auxMainLoop в основната функция, поставете ред:

Привеждането в съответствие е установено, като се обадите функция с параметър glPixelStorei GL_UNPACK_ALIGNMENT и втори параметър - цяло число, което показва подравняването. Изображенията се показват директно на екрана. Затова всичко, което се провежда в двуизмерни координати. Положението, при което изходните изображение започва, обозначени с glRasterPos2d (х, у) функция. Също така можете да зададете размера на пикселите, като се обадите glPixelZoom. Първият параметър на функцията - ширината, а вторият - на височината на пиксел. Аз наричам тази функция с аргументи (1.1), което съответства на нормалната пиксел. Заменете (1.1) до (3.2) и ще видите как на снимката ще се удължи до три пъти хоризонтално и вертикално два пъти. Това се случи, защото сега всеки пиксел отговаря на 3x2 правоъгълник в прозореца. И накрая, на изхода е функция на glDrawPixels. Първите два параметъра - ширината и височината. След това се определи форматът, в който информацията се съхранява в паметта, както и вида на елементите на масив. Последното показва масив от данни. Функцията дисплей, поставете следния код:

Също така на разположение в зависимост OpenGL glBitmap за показване на растерни изображения. Bitmap - последователност от байтове, които кодират снимка на двата цвята. Съответно, всеки байт кодира 8 пиксела. Сред придружаващите програми ще намерите моя полза pcx_2bpp. Тя гласи, PCX-файлов формат един бит на пиксел и насочва стандартния изход масив в C език.

OpenGL - работа със снимки

Източникът файл тук. Изпълним тук. Снимката ми тук.

5.3 Упражнение: "Background за играта Arcanoid"

OpenGL - работа със снимки

Източникът файл тук. Изпълним тук. Звездното небе тук.

5.4 Създаване на текстура памет

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

Първо, ние ще обсъдим създаване и текстуриране на самолета. След това, помислете за текстура картографиране на обектите, описани в раздел 4.1. И накрая, на всички други създадени от полигони; по-специално, изпъналостта и електрическа кана.

За да приложите текстура към обект, трябва да:

  1. Качете графичен файл в паметта
  2. Създаване текстура име идентификатор
  3. Направете го активен
  4. Създаване на цветна карта памет
  5. Настройте параметрите на текстура
  6. Настройте параметрите на взаимодействието с текстури на обекта
  7. Assign текстура координати на обекта

Първото нещо, което сте научили, за да се направи в предишния раздел. Създаване на проект, наречен Texture. Декларирам следните глобални променливи:

Променливи photo_tex space_tex и ще служат като идентификатори на текстури. И photo_image space_image и ние ще се зареди ВМР-файлове. Тук трябва да се отбележи, че в OpenGL текстура трябва да е с размер 2 n х 2 метра, където пит числа. Това се прави, за да се ускори, тъй като компресирате или да разширят като текстура по-бързо и по-удобно. Разбира се, можете да качите снимка на всеки друг размер, но той ще трябва да бъде намалена. По мое мнение, това е грешно. В резултат на мащабиране не може да осигури. Така че аз използвам файловете с изображения на размера на кратно на степен на две. Аз предпочитам да редактирате изображението във всеки графичен пакет, го отрежете, или обратно, за да се допълни, отколкото да разберете защо това е изкривен. Въпреки това, много зависи от конкретния случай. Художникът, който прави текстурата, не ме интересува какъв размер да се направи, така че е по-лесно да го помоли да направят образ на съответния размер. Поставете следния код в основната функция.

Правене на снимки на моята програма - Texture. Фото могат да си вземе. ;-) Просто промените размера, че е желателно да напусне 512x512.

Сега трябва да се създаде структура име идентификатор. Необходимо е да се създаде, когато имате приложението използва повече от една структура, за да може да ги различи по някакъв начин. В противен случай, когато текстурата е само една, тя не се нуждае ID. В следващия пример, когато текстура на областта, ще имаме точно една текстура, и аз ще ви покажа на предизвикателствата, които функции са задължителни. В същото време, аз Ви предлагам да се наложи да използвате няколко текстури. Между другото, аз погледнах през много примери, когато пиша книга. Сред тях бяха примери на добре познатата червена книга, примери от MSDN, интернет и други източници, но всичко за текстури, които работят само с една текстура. Например, блок-програма, разбира се, излезе и една текстура, но за сериозна заявка е малко вероятно. Ние искаме да пиша сериозно приложение, така че трябва да използвате няколко текстури. функция glGenTextures взема като вход два параметъра. Първият показва броя на имената текстура-идентификатор, който искате да създадете. Вторият вариант - указател към масив от неподписани елементи тип Int. Броят на елементите в масива трябва да съответства на броя, посочен като първи параметър. Например, следния код създава текстури десет имена.

Дръжте текстури идентификатори в масива не винаги е удобно. Този метод е подходящ за съхранение обратно среди и видове стени - тухла, камък и др Като цяло, на масива съхранява елементите между които има нещо общо. В този случай, двете изображения са свързани, защото използвана в същото приложение, така че съм създал две различни идентификатор. Така че добавете следния код с главната функция.

Сега ние се придържат към изображенията на текстурата, т.е. Правим го активен. За тази функция цел glBindTexture. Първият параметър да GL_TEXTURE_2D или GL_TEXTURE_1D. Тя показва едномерен или двуизмерен образ ще работи. Всички примерите тук се отнасят двуизмерни текстури. За едномерен текстура, аз просто не съм намерил един красив пример. Въпреки това, в Червената книга е пример за едномерен текстура. Има Kettle боя червена панделка. Къде да вземе тези примери и много други виж допълнение "А". Вторият параметър glBindTexture - ID че ние създадохме горе, използвайки glGenTextures. Сега добавете призив за тази функция в главната.

Сега ние трябва да се създаде паметта на цветна карта. масив от байтове за AUX_RGBImageRec структура дори не е текстура, защото текстурата много различни варианти. Създаване на структура, ние сме надарени с неговите специфични свойства. Сред параметрите на текстура определяте нивото на детайлност, метода на мащабиране и текстура свързване с даден обект. Нивото на детайлност, необходими за картографиране текстура на по-малките обекти, т.е. когато повърхността на екрана по-малък от размера на изображението. Нулевата нивото на детайлност съответства на първоначалния размер на изображението 2nx2m, първо ниво - 2n-1x2m-1, к-то ниво - 2n-kx2m-к. Броят на нива съответства минути (п, т). За създаване на текстурата има две функции glTexImage [1/2] D и gluBuild [1/2] DMipmaps.

Основната разлика е, че първата функция създава определено ниво на детайлност и текстура вижда само изображението. размер, което е кратно на степен на две. Втората функция е по-гъвкав. Той генерира всички нива текстура подробно. Също така, тази функция не изисква, че размерът на кратно на степен на две. Тя ще се свие / разтегнете самата подходящо изображение, въпреки че може би се оказва, че не е най-добрият. Взимам функция glTexImage2D. Първият параметър на тази функция трябва да бъде GL_TEXTURE_2D. Вторият - на нивото на детайлност. Ние се нуждаем от оригиналното изображение, така че нивото на детайлност - нула. Третият параметър определя броя на цветните компоненти. Нашият образ се съхранява в RGB формат. Следователно, стойността на този параметър е равен на три. Четвъртото и петото параметри - ширина и височина на изображението. Шесто - ширината на границата; няма да имаме граници, така че тази стойност - нула. След седми параметър - формат за съхранение на пикселите в масива - GL_RGB и тип - GL_UNSIGNED_BYTE. И накрая, на осмия параметър - указател към масив от данни. И все пак, трябва да се обадите на функция glPixelStorei и питам, че трасето в байт данни е включен. Добавете следния код към основната функция.

Подобен резултат може да се получи чрез вмъкване на повикване gluBuild2DMipmaps с параметрите, посочени по-долу.

Сега трябва да се настройват параметрите на текстура. Защото това е функцията

Първият параметър поема GL_TEXTURE_1D стойност или GL_TEXTURE_2D. Второ - pname - се определя от параметъра текстура, че ще се промени. И третият вариант - набор стойност. Ако сте използвали gluBuild2DMipmaps glTexImage2D вместо това, тогава не е нужно да инсталирате следните опции, като вече формира структурата на всички нива на детайлност и OpenGL текстура ще бъде в състояние да изберете подходящото ниво, ако площта на обекта не е същият, както в областта на текстура. В противен случай, трябва да добавите следните редове:

Посочили сте, че за да се намали и да се увеличи текстурата използва GL_NEAREST алгоритъм. Това означава, че цвета на пиксела на обекта, за който се прилага текстура, цвят става най-близкия пиксел текстура елемент. Вместо това, можете да укажете GL_NEAREST GL_LINEAR, т.е. цвят обект елемент се изчислява като средна стойност от четирите текстура елементи. Има четири цвят алгоритъм за изчисляване на обект елемент. Те могат да бъдат инсталирани, когато настроите текстурата с всички нива на детайлност, като GL_NEAREST използват алгоритми и GL_LINEAR с един или два близки нива на детайл.

И все пак, можете да зададете на взаимодействието с текстурата на обекта. Има два режима на използване на три цветови компоненти. Първият режим е по подразбиране, когато се вземат под внимание на цвета на цвета на обекта и текстурата. Полученият цвят се получава чрез умножаване компоненти на цвета на структурата на компонентите на цветни обект. Например, ако цвят текстура - (R, G, Ь), и цвета на обекта, към който се прилага, - (r0, g0, b0), полученият цвят ще - (R * r0, г * g0, б * b0) , Ако цветът на обекта черно - (0,0,0), тогава няма да я видите на текстурата, така че ще бъде изцяло в черно. Втората форма на взаимодействие, когато не се смята за цвета на обекта. Полученият цвят е цветът на текстурата. Тези параметри могат да бъдат настроени по следния начин.

По подразбиране, както казах, това е GL_MODULATE режим. Сега направи активен текстура space_tex. И пак същото за нея. Това завършва създаването на текстури. Той остава асоцииран текстурни координати на обекта, координира. Редактиране на функцията на дисплея, както следва:

Както вероятно се досещате, glTexCoord2d отговаря на текстурните координати на четириядрени. Освен да кажа, че в долния ляв ъгъл на текстура координира (0,0), и в горния десен ъгъл - (1,1).

OpenGL - работа със снимки

Източникът файл тук. Изпълним тук.
Снимката ми тук. Звездното небе тук.

5.5 Повтаряне текстура

Ripple текстура на самолета не е твърде трудно. Нека да редактирате програмата в предишния раздел. С цел да бъде в състояние да се повтаря текстурата, трябва да инсталирате опция GL_REPEAT за своята S и T координати. S-координата на текстурата - това е хоризонталата координира, T-координира - вертикално. Вторият параметър, който може да се настрои за координатите, - GL_CLAMP. Той гарантира, че текстурата няма да бъде възпроизведен. GL_REPEAT по подразбиране. Но аз все още се получи съответния код, който представлява, как да настроите този параметър. В основната си функция да добавите следните редове:

Сега редактирате функцията на дисплея.

функция glTexCoord свързва текстурата координира към върховете на обекта. Както споменах и преди, в долния ляв ъгъл на текстурата има координата (0,0), и в горния десен ъгъл - (1,1). Ако зададете стойност на котва е по-голям от един, текстурата се повтаря. В нашия пример, координатната (0,0) текстура ние свързана с долния ляв връх самолет с координира (-4, -4) и координатната (3.2), за да текстурирате горния десен връх (4,4). По този начин, ние имаме текстура за умножение хоризонтално в размер на три парчета и вертикално в размер на две части. Другите две върхове, ние вързани правилно. Ако има не цифрите показват, изображението се наклони.

OpenGL - работа със снимки

Източникът файл тук. Изпълним тук.
Снимката ми тук. Звездното небе тук.

5.6 Упражнение: "Rotate текстура"

Zavraschayte равнина снимка около ос X и Y. Също така, да варира равномерно по оста Z 3-7.

OpenGL - работа със снимки

Източникът файл тук. Изпълним тук.
Снимката ми тук. Звездното небе тук.

5.7 Структурата на сферата

Тук ще ви покажа как се работи с една единствена текстура и прилага текстура към сферата. Създаване на нов проект с името на областта. Добави глобална променлива.

В основния товар на изображение и създаване на текстура. Тъй като текстура, която имаме в това приложение само едно, че не е необходимо да се създаде идентификатор за него.

Редактиране на функцията на дисплея. Тук всичко е запознат с теб, виж. 4.1, с изключение на gluQuadricTexture. Тази функция активира или деактивира текстура картографиране на триизмерен обект. Вторият параметър GL_TRUE или GL_FALSE. картографиране на текстурата по подразбиране е забранено.

OpenGL - работа със снимки

Източникът файл тук. Изпълним тук.
Снимката ми тук.

5.8 Упражнение "Texture към живота"

Нанесете текстура към цилиндъра, конус, както и частични твърдите дискове. Като образ, да отнеме известно мозайки, грах и т.н. защото нещо не е много добър ще изглежда разумно.

5.9 Texture на чайника

Текстурата може да се прилага към обекти с всякаква сложност. За тази цел е необходимо да се даде възможност да се генерират автоматично текстурни координати - glEnable (GL_TEXTURE_GEN_S) и glEnable (GL_TEXTURE_GEN_T). На следващо място, трябва да инсталирате една от трите поколение текстура координира алгоритми.

  1. GL_OBJECT_LINEAR
  2. GL_EYE_LINEAR
  3. GL_SPHERE_MAP

координира алгоритъм поколение, създадена с помощта на glTexGeni функция. Първият параметър показва типа на функция на координатите за които ще бъдат определени алгоритъма. GL_S хоризонтално координират, GL_T - вертикално. Вторият параметър на тази функция трябва да бъде GL_TEXTURE_GEN_MODE. И третият параметър - един от алгоритмите, изброени по-горе. Създайте друг проект, наречен чайник. Редактиране на основната функция, както и в предишната програма, където се наслагва върху изображението сфера. Просто добавете една линия има glEnable (GL_AUTO_NORMAL), чайника изглеждаше по-добре. Този режим позволява изчисляването на нормалните вектори, което дава възможност да се получи по-добро изображение, но отнема известно време. Функция на дисплея, редактирате, както е показано по-долу.

OpenGL - работа със снимки

Източникът файл тук. Изпълним тук.
Снимката ми тук.

OpenGL - работа със снимки

OpenGL - работа със снимки

Източникът файл тук. Изпълним тук.

5.10 Упражнение "текстура на тор"

Направете същото предаване само за изпъналостта.

Подкрепете проекта - споделете линка, благодаря!