Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Пишем движок

Поиск:
Часть II - Карта прозрачности.

Что такое карта прозрачности? Это чёрно-белый рисунок, который указывает на то, какие части поверхности должны иметь определённую степень прозрачности. Надо знать, что прозрачности в OpenGL, как таковой - нет. Это просто ещё один компонент цвета, который отображает яркость. По другому тут не скажешь. понимание этого определения достигается путём долгих экспериментов. Ладно, без оффтопика...

Как всё устроено.
Всё просто... У нас есть две картинки... Конечно, если вы можете грузить картинки с альфа каналом, то вы без проблем будете обходиться и одной картинкой, главное чтобы вы могли отделить альфа канал от RGB-канала. Сначала мы отображаем поверхность, затем отключаем тест глубины, включаем смешивание, и устанавливаем на выход(GL_DST_COLOR) чёрный цвет(GL_ZERO)(т.е. всё что будет на альфа-карте чёрным цветом - будет отображаться на поверхности, а всё что белым - нет, эта область будет прозрачна), затем накладываем на неё альфа-карту и отображаем поверхность. Это мы нарисовали нашу поверхность, прозрачную там где нам надо. Теперь ещё ведь и наложить саму текстуру следует: устанавливаем в получаемом цвете буфера и источнике единицу(GL_ONE), затем накладываем RGB-картинку, после чего опять рисуем поверхность. После всего этого мы вновь включаем тест глубины и отключаем смешивание цветов.

Чтобы осознать как всё происходит надо понимать, как это работает. Вспомните свою основную функцию прорисовки в OpenGL... Какие функции там есть?
glClear()glLoadIdentity()gluLookAt()... По сути эта функция - это один кадр вашего проекта. Теперь понимаете? В данной функции вы указываете то, как надо отобразить объекты, при чём в это время ничего не происходит, до тех пор, конечно, пока функция не закончится. Потому что по её окончанию, результат будет выведен на экран. Когда мы рисовали поверхности, накладывая на них различные картинки - мы не создавала тем самым несколько поверхностей. Мы их просто рисовали в буфере ОДНОГО кадра. Теперь о смешивании... Функция glBlendFunc()... Если объяснить на пальцах, то мы делаем так: рисуем в буфер кадра всё, что чёрное, а белое отбрасываем... Отбрасываем посредством смешивания... Ниже я приведу код и вы, я думаю, догоните в чём замес.

Код
Код

...//код перед
glDisable(GL_DEPTH_TEST);//Отключаем тест глубины
glBlendFunc(GL_DST_COLOR, GL_ZERO);//Записываем в буфер кадра только цвета соответствующие чёрным оттенкам альфа-карты
glEnable(GL_BLEND);//Включаем режим смешивания

skin->transparencyMap->setTexture();//Устанавливаем текстуру альфа-карты

glBegin(GL_POLYGON);//Рисуем полигоны
    for (j = 0; j < polygon[i].vertexCount; j++)//Идём по всем вершинам
    {
        glTexCoord2f(/*UV координаты альфа-карты*/);
        glVertex3f(/*коордианты вершины*/);
    }
glEnd();

glBlendFunc(GL_ONE, GL_ONE);//Рисуем всё, в буфер кадра, куда пишется только места с оттенком чёрного цвета. Тут надо въехать, что наш кадр как бы делится на два "подкадра": сначала мы рисуем первую половину, праллельно тем самым задавая параметры рисования второй половины.

skin->texture->setTexture();//Устанавливаем отображение самой текстуры - RGB-картинки

glBegin(GL_POLYGON);//Рисуем полигоны
    for (j = 0; j < polygon[i].vertexCount; j++)//По всем вершинам идём
    {
    glTexCoord2f(/*UV координаты RGB-картинки*/);
    glVertex3f(/*коордианты вершины*/);
    }
glEnd();

glDisable(GL_BLEND);//Отключаем смешивание
glEnable(GL_DEPTH_TEST);//Включаем тест глубины.
...//код дальше


Маленькая важность отображения объектов, на последок.
Дело в том, что, когда мы рисуем такие поверхности, мы отключаем тест глубины, а следовательно, объекты, которые были нарисованы раньше - будут "перекрыты" объектами в отображении которых есть отключение теста глубины, вне зависимости от того, кто расположен ближе к "зрителю". Таким образом можно сделать несложное умозаключение: сначала надо отображать те поверхности(объекты и т.п.), которые используют в своём отображении отключение теста глубины, а потом - все остальные.

Благодарю за внимание.

©Gepard aka [ss]3L33T@
Автор: gepard
Сайт: http://avatar.dm9.ru/1.htm






Просмотров: 5819

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную