ВИЗНАЧЕННЯ КОЛЬОРУ ВЕРШИНИ – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

У попередньому прикладі ми встановили глобальний колір але замовчуванням для всіх вершин, які ми малюємо за допомогою gl Col or4f Іноді нам потрібно більш тонкий контроль (наприклад, можливість встановлювати колір для кожної з вершин) OpenGL ES пропонує нам даний функціонал, який по-справжньому легкий у використанні Все, що нам треба зробити, – додати float-компоненти RGB А до кожної вершини і повідомити OpenGL ES, де можна знайти колір для всіх вершин так само, як ми повідомляли, де можна знайти розташування кожної вершини Почнемо з того, що присвоїмо колір кожної вершині:

Спочатку необхідно виділити ByteBuffer для наших трьох вершин Який розмір повинен мати цей ByteBuffer У нас є дві координати і чотири (RGBA) компонента кольору для кожної вершини, що в сумі становить 6 чисел з плаваючою крапкою Кожне значення float займає 4 байта, так що кожна вершина вимагає 24 байта Ми зберігаємо дану інформацію в VERTEXSIZE Коли ми викликаємо ByteBufferallocateDirect, ми просто множимо VERTEX SIZE на кількість вершин, яке хочемо зберегти ByteBuffer Залишилося частина зрозуміла сама по собі Ми отримуємо вид Fl oatBuf fer для нашого ByteBuffer і поміщаємо вершини методом put в ByteBuffer Кожен ряд масиву float містить х-і г /-координати, а також R-, G-, В-і А-компоненти вершини саме в такому порядку

Якщо ми хочемо візуалізувати це, нам необхідно повідомити OpenGL ES, що наші вершини не тільки мають місце розташування, але також і властивість кольору Ми це робимо так само, як і раніше, за допомогою виклику gl Enabled ientState:

Тепер, коли OpenGL ES відомо, що можна очікувати інформацію про становище і кольорі для кожної з вершин, ми повідомляємо, де можна отримати цю інформацію:

Ми починаємо з установки положення нашого FloatBuffer Позиція вказує нах-координату нашої першої вершини в буфері Далі викликаємо gl VertexPointer

Єдина відмінність від попереднього прикладу полягає в тому, що тепер ми також описуємо розмір вершини (памятаєте, що він вказується в байтах) OpenGL ES почне зчитування місця розташування вершин, починаючи з того адреси в буфері, яке ми вкажемо Для опису положення другого вершини додамо байти VERTEX SIZE до даних першої вершини і т д

Далі ми встановлюємо місце розташування буфера для компонента R нашої першої вершини і викликаємо glColorPointerO, який повідомляє OpenGL ES, де можна знайти кольору вершин Перший аргумент – це кількість компонентів на колір Він завжди дорівнює чотирьом, оскільки OpenGL ES вимагає від нас компоненти R, G, В і А для кожної вершини Другий параметр описує тип кожного компонента Як і з координатами вершин, ми знову використовуємо GL10GL FLOAT для вказівки, що кожний колірний компонент є числом з плаваючою крапкою в діапазоні від 0 до 1 Третій параметр – це інтервал між квітами вершин Він, природно, дорівнює інтервалу між розташуванням вершин Останній параметр – це знову наш буфер вершин

Оскільки ми викликали vertices Position (2) перед gl Col orPoi nter, OpenGL ES знає, що дані кольори першої вершини можна знайти, починаючи з третього числа float в буфері Якби ми не вказали, що місце розташування буфера дорівнює 2, OpenGL ES почав би читати кольору з 0 Це було б не дуже добре, оскільки спочатку у нас йдуть х-координати нашої першої вершини

Малюнок 78 демонструє, звідки OpenGL ES читатиме властивості вершин і як він перескакує від однієї вершини до іншої для кожного з властивостей

Щоб намалювати наш трикутник, ми знову викликаємо gl DrawEl ements, який наказує OpenGL ES намалювати трикутник, використовуючи перші три вершини нашого FloatBuffer:

Оскільки ми використовували константи GL10 GL VERTEX ARRAY і GL10 GL C0L0R ARRAY, OpenGL ES знає, що він повинен застосовувати властивості, певні gl VertexPointer і gl ColorPointer Він буде ігнорувати колір, заданий за замовчуванням, оскільки ми вказуємо окремий колір для кожної вершини

Рис 78 FloatBuffer вершин, початкові адреси для OpenGL ES, щоб прочитати місце розташування / колір, і крок, використовуваний для переходу до наступного місцю розташування / кольором

ПРИМІТКА

Те, як ми тільки що описали місце розташування наших вершин, називається чергуванням (interleaving) Це означає, що ми записуємо всі властивості вершин в один блок памяті Досягти такого ефекту також можна, скориставшись масивами не чередувальних вершин (noninterleaved vertex arrays) Ми можемо використовувати два FloatBuffer: один для вказівки місця розташування, інший для кольору Проте чергування набагато зручніше застосовувати з точки зору економії памяті, так що ми не будемо тут обговорювати масиви не чередувальних вершин

Зєднання всього разом в новій реалізації GLGame і Screen повинно тепер здатися зовсім простим У лістингу 76 показаний фрагмент з файлу Col oredTri angl eTest Java Я опустив шаблонний код

Лістинг 76 Уривок з ColoredTriangleTestJava Чергування властивостей місця розташування і кольору

Здорово, вийшло цілком нехитро Все, Що ми змінили в порівнянні з попереднім прикладом, – додали в наш Fl oatBuf fer чотири компоненти кольору для кожної з вершин і використовували GL10 GLC0L0RARRAY Найкраще в даних змінах те, що будь-які додаткові властивості, які ми будемо приписувати нашим вершин пізніше, працюватимуть рівно таким же чином Ми просто вказуємо OpenGL ES не використовувати значення, задані за замовчуванням для даної властивості, а замість цього брати властивості в нашому FloatBuf fer, починаючи з певного адреси і пересуваючись від вершини до вершини по байтах VERTEX SIZE

Тепер ми можемо також вимкнути GL10 GLC0L0RARRAY, щоб OpenGL ES міг знову використовувати колір за замовчуванням, який ми визначили за допомогою glColor4f, як це робилося раніше Для цього ми викликаємо: glglDisableCli entState(GL10GL C0L0R ARRAY):

OpenGL ES просто вимкне властивість читання кольору з нашого FloatBuf fer Якщо ми вже встановили покажчик кольору з допомогою glColorPointerO, OpenGL ES запамятає покажчик, однак ми тільки що наказали йому його не використовувати

Щоб підвести підсумки, розглянемо висновок попередньої програми (рис 79)

Рис 79 Трикутник, де колір кожної вершини описаний окремо

Виглядає досить мило Ми не говорили про те, як OpenGL ES буде використовувати ті три кольори, які ми вказали (червоний для нижньої лівої вершини, зелений для нижньої правої і синій для верхньої) Як виявилося, він інтерпольованого кольору між вершинами Такий підхід дозволяє без праці створювати хороші градієнти Однак нам явно недостатньо тільки використання кольору, адже ми збираємося малювати зображення з допомогою OpenGL ES Ось де нам стане в нагоді обробка текстури

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*