Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пишем движок, Часть II: карта прозрачности 
:(
    Опции темы
gepard
  Дата 5.6.2005, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 8
Всего: 40



Часть 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 - 5.6.2005, 06:11


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
chipset
Дата 5.6.2005, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 2
Всего: 165



В ФАК Ю! smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
gepard
Дата 5.6.2005, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 8
Всего: 40



smile


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 9.6.2005, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



gepard, если не сложно, можешь выложить простенький .exe-пример, показывающий результат применения этих карт прозрачностей ?




--------------------
С уважением, г-н Посол.
PM   Вверх
gepard
Дата 10.6.2005, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 8
Всего: 40



См. аттач.
Серый куб под плоскостью, к которой применена карта прозрачности.

Присоединённый файл ( Кол-во скачиваний: 34 )
Присоединённый файл  123.zip 106,73 Kb


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 10.6.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Хм... Я думал пример пояснит одну вещь, но так и не прояснил... Скорее всего, задаю глупый вопрос: smile
Когда используется карта прозрачности ?... Чем она лучше простой текстуры с альфа-каналом ?
Единственное преимущество я вижу лишь в том, что карта прозрачности может иметь другое разрешение, нежели сама текстура, скорее всего, применяется более меньшего разрешения, типа сделать дырку в земле... Но это ценой двойной прорисовки...
Может напишешь в статье, когда она используется, зачем и чем лучше - для таких как я... немного отставших от времени smile ?



--------------------
С уважением, г-н Посол.
PM   Вверх
gepard
Дата 11.6.2005, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 8
Всего: 40



А разниы никакой и нет. Я же писал об этом в статье. Что мол можете и текстуру с альфа каналом юзать


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 11.6.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Понятно... Ну раз разницы нет, тогда зачем она нужна ? smile Ты так и не написал, в каких случаях удобно это использовать... Я вижу 2 недостатка:
- два прохода
- отключение Z-теста

Когда же текстура с альфа-каналом, Z-тест отключать не надо, и рисуется за один проход...

PS: Не совсем понятно это:
Цитата(gepard @ 5.6.2005, 05:51)
Таким образом можно сделать несложное умозаключение: сначала надо отображать те поверхности(объекты и т.п.), которые используют в своём отображении отключение теста глубины, а потом - все остальные.
Хотя судя по примеру, который ты выложил - прозрачная поверхность рисуется позже чем непрозрачный куб, т.к. если опуститься ниже (кнопкой E), то "прицел"(прозрачная поверхность) всё равно будет поверх куба, хотя от камеры находится за кубом...




--------------------
С уважением, г-н Посол.
PM   Вверх
gepard
Дата 12.6.2005, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 8
Всего: 40



Цитата(p0s0l @ 11.6.2005, 12:21)
Хотя судя по примеру, который ты выложил - прозрачная поверхность рисуется позже чем непрозрачный куб, т.к. если опуститься ниже (кнопкой E), то "прицел"(прозрачная поверхность) всё равно будет поверх куба, хотя от камеры находится за кубом...

Верно.

Цитата(p0s0l @ 11.6.2005, 12:21)
Когда же текстура с альфа-каналом, Z-тест отключать не надо, и рисуется за один проход...

Продемонстрируй.


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 12.6.2005, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Ну... Примерно так, надо только объединить две текстуры в одну с альфа-каналом...
Код
...//код перед    
//glDisable(GL_DEPTH_TEST);//Отключаем тест глубины    
// тут 2 варианта, первый аналог того, что делал gepard
// второй вариант мне больше нравиться, но нужно немного по-другому делать альфу-карту
// 1)
glBlendFunc(GL_ONE, GL_SRC_ALPHA); // или можно попробовать glBlendFunc(GL_DST_ALPHA, GL_SRC_ALPHA);
// 2)
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);

glEnable(GL_BLEND);//Включаем режим смешивания    
skin->texture->setTextureWithAlphaChannel();//Устанавливаем отображени самой текстуры - RGBA-картинки (с альфа-каналом)
glBegin(GL_POLYGON);//Рисуем полигоны    
    for (j = 0; j < polygon[i].vertexCount; j++)//По всем вершинам идём    
    {    
    glTexCoord2f(/*UV координаты RGBA-картинки*/);    
    glVertex3f(/*коордианты вершины*/);    
    }    
glEnd();    
glDisable(GL_BLEND);//Отключаем смешивание    
//glEnable(GL_DEPTH_TEST);//Включаем тест глубины.    
...//код дальше
Ну и рисовать прозрачные полигоны нужно в конце, после непрозрачных...




--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.1222 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.