OpenGL - FPC - Розділ 17

Книги

OpenGL / FPC - Розділ 17

Працювати з текстурами в OpenGL так складно, як думають деякі. Це складно, але для того, щоб почати, вам не потрібно знати всі тонкощі та подробиці. У цьому розділі ми просто нанесемо дуже просту згенеровану текстуру на екран.

Текстура - це просто послідовність даних про пікселі - майже як растр. Давайте уявімо: покажчик на деяку область пам'яті. Спочатку йде значення червоного кольору для першого пікселя, потім зеленого, а потім синього кольору. Після цього йде значення червоного кольору для наступного пікселя і таке інше. Звичайно, це стосується простої RGB текстури, але суть саме в цьому.

Отже, є певна інформація про малюнок. Як завжди, OpenGL вимагає ідентифікатора цієї текстури. Ми attach цей id до нашої області пам'яті і говоримо OpenGL використовувати цей блок пам'яті щоразу, коли ми активуємо наш id. Така ситуація в теорії. Подивимося на код.

Спочатку нам потрібний id. Це просто змінна типу GLuint. Визначимо також покажчик на дані нашої текстури.

По-перше, не забудьте виділити пам'ять для вашого покажчика. Її розмір - ширина малюнка, помножена на висоту, і помножена на число байт, що представляють піксель. Наприклад, RGB потрібно 3 байти на піксель, RGBA - 4 байти, і так далі. Я використовуватиму RGB текстуру розміром 128x128.

Тепер перейдемо до команд OpenGL. Ми активуємо текстурне відображення просто увімкнувши його. Потім вказуємо OpenGL зарезервувати для нас ID для однієї текстури та зберігати його в TextureID.

Тепер ми активуємо текстуру і прив'язуємо наш покажчик до активованого ID (не плутайте – для активування використовується glBindTexture, а glTexImage2D – для завантаження даних із покажчика).

Тепер слідініціалізувати нашу текстуру. Так ми настроюємо поведінку нашої текстури. Це важливо! Не пропускайте цей крок.

А тепер і йде власне завантаження даних текстури в OpenGL простір.

Ми повинні задати тип пікселя, розмір текстури і порядок дотримання параметрів пікселя. Наприклад, це може бути GL_BGR та інша. Якщо хочете дізнатися, зверніться до довідкового посібника з api. Також задається покажчик, яким зберігаються наші дані.

Перед тим, як продовжити, ще трохи про OpenGL та розміри текстур. Текстура повинна мати розмір 2^n. Це означає, що можна використовувати текстури виду 8*8, 16*16, 32*32, 64*64, 128*128 і так далі, але ніяк не текстури виду 640*480. Можна подумати "Що за нісенітницю?!", але це так. Звичайні текстури мають таке обмеження, з цим нічого не вдієш. Звичайно, є спосіб використовувати текстури будь-якого заданого розміру, але це досягається іншим способом. Я поясню це пізніше, добре? А зараз попрацюємо з 2^n.

А все вже налаштовано. Тепер час намалювати поверхню і прикріпити до неї текстуру. Зазвичай працюють із кількома текстурами, отже спочатку потрібно пов'язати з поверхнями ту текстуру, що ми маємо намір використовувати.

Далі слід сказати OpenGL, як саме ми хочемо прикріпити текстура до поверхні. Це досягається за допомогою команди glTexCoord2f. Процедура малювання виглядає приблизно так.

Подивіться уважно. glTexCoord2f визначає краї текстури та те, як вони приєднуються до поверхні. 0 – це лівий/верхній край, а 1 – правий/нижній. Якщо дивитися на поверхню, лівий/верхній край текстури приєднується до лівого/верхнього краю поверхні. Якщо вказати, скажімо, значення 2, текстура буде намальована двічі. Значення 0.5 означатиме, що буде намальовано лишеполовина текстури.

Якщо як текстура ми хочемо використовувати малюнок, його треба просто завантажити з файлу. Бітмапи завантажувати досить легко, JPG та інші формати трохи складніше. Можна також самим формувати щось і малювати це у сфері текстури. Такі згенеровані текстури (або математичні текстури, як їх іноді називають), мають велику перевагу в тому, що вони займають мало місця — якихось байт в алгоритмі. Ми, однак, займемося ними у наступному розділі. А тепер просто переконайтеся, що ви все зрозуміли.