Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2010, 20:51   #1
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
Восклицание Эффекты в OpenGL

Здравствуйте. Подскажите, если кто знает, как делать в OpenGL эффекты при выводе картинки на экран? Это не дублирование темы с эффектами. Просто вот при работе с Canvas'ом это делалось так: брался Bitmap, который должен выводиться на экран, и с ним проводились какие-то действия. Но в OpenGL есть контекст воспроизведения. С ним, как я понимаю, все не так просто.

Одним из таких эффектов, который мне удалось реализовать, используя все имеющиеся у меня знания (знания всего пары функций) - плавный переход в черный цвет. Я просто добавлял glColor3f(); перед рисованием изображения, а параметры у этой функции менял с тем, чтобы они постепенно стремились к 0. Но перехода в белый цвет мне реализовать таким способом не удалось.

Есть вариант: взять белую картинку и накладывать ее на экран, постепенно меняя у нее прозрачность. Но как средствами OpenGL менять прозрачность у картинки? Вообще, какие есть функции в OpenGL для реализации таких эффектов? Вот их примерный список:

1. Переход в какой-либо цвет.
2. Переход в черно-белое изображение и обратно.
3. Размытие.
4. Рассеянное освещение.

Полагаю, что стандартными функциями тут не отделаешься...
ZotaC вне форума Ответить с цитированием
Старый 05.08.2010, 09:12   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

В соседней теме про эффекты я уже помнится написал про основные способы. Вам лучше бы использовать спрайт. То есть как-то так:
Пример реализации перехода в белый:
Код:
glBegin(GL_QUADS);
glColor4f(1,1,1,Alpha);
glVertex2f(0,0);
glVertex2f(Width,0);
glVertex2f(Width,Height);
glVertex2f(0,Height);
glEnd;
, где Alpha меняется от 0 до 1. Для этого примера должна быть установлена ортографическая проекция (не перспектива).
Соответственно для перехода в любой цвет пишите:
Код:
glColor4f(Color.r,COlor.g,Color.b,Alpha);
С размытием есть такой вариант: гуглите "рендер в текстуру" и затем текстуру меньшего чем экран разрешения накладывайте на вышеописанный спрайт, добавив текстурные координаты. Эта техника при наложении на бОльший объект даст эффект размытия. Это самый простой метод размытия, ещё можно как-то через пост-эффекты. (опять же гугл в помощь)
Цитата:
4. Рассеянное освещение.
Что вы имеете в виду? Если читать как есть, то это обычное освещение, разве нет?
Цитата:
Полагаю, что стандартными функциями тут не отделаешься...
Как видите, отделаешься)
Ах да, забыл:
Цитата:
2. Переход в черно-белое изображение и обратно.
Вообще-то на ум приходит только рендер в текстуру с последующим натягиванием на спрайт в шейдере, который делает усреднение...

Кстати, если вдруг задумаете эффект отображения только с отдельными компонентами цвета(R,G,B), то в большую помощь вам есть процедурка glColorMask.http://faceh0r.narod.ru/doc/m_glColorMask.html
Изобретатель велосипедов

Последний раз редактировалось Selestis; 05.08.2010 в 09:26.
Selestis вне форума Ответить с цитированием
Старый 05.08.2010, 09:23   #3
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Есть вариант: взять белую картинку и накладывать ее на экран, постепенно меняя у нее прозрачность. Но как средствами OpenGL менять прозрачность у картинки?
Поверх сцены рисуем примитив, например через квад. Перед рисованием устанавливаем цвет в RGBA формате:
Код:
glColor4f(RED,GREEN,BLUE,ALPHA);
Последний параметр альфы и отвечает за прозрачность. Чтобы она работала перед рисованием надо включить блендинг (режим смешивания цветов):
Код:
glEnable(GL_BLEND);
То есть вот как примерно должно выглядеть:
Код:
glEnable(GL_BLEND);
glBegin(GL_QUADS);
glColor4f(RED,GREEN,BLUE,ALPHA);
glVertex3f(0,0,0);
glVertex3f(0,600,0);
glVertex3f(800,600,0);
glVertex3f(800,0,0);
glEnd;
glDisable(GL_BLEND);
Регулируя значение ALPHA добьешься плавного перехода к указанному цвету.

Цитата:
2. Переход в черно-белое изображение и обратно.
Точно не знаю, может есть несколько способов добиться этого, но я делал через пиксельный шейдер. При этом через шейдер можно сделать не просто черно-белое, но и например серпий или как нибудь еще.
Код:
3. Размытие.
Тоже шейдером можно делать. Насколько помню называется алгоритм Гаусса. Или через пинг-понг (поочередный рендеринг картинки в буферы низкого разрешения, размытие достигается фильтрацией текстур).
Код:
4. Рассеянное освещение.
Что именно имеешь в виду?
Делал както три демки с эффектами через шейдеры (черно-белый фильтр, размытие и bloom). Вот тут можно ознакомиться:
http://www.programmersforum.ru/showp...6&postcount=43

Последний раз редактировалось Вадим Буренков; 05.08.2010 в 09:26.
Вадим Буренков вне форума Ответить с цитированием
Старый 05.08.2010, 11:33   #4
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Спасибо за ответы, я попробую сделать все сообразно вашим советам. Рассеянное освещение... Хм... Ну, как я полагаю, это эффект, добавляющий свечение в тех местах изображения, где уже есть освещаемые участки. Немного непонятное объяснение, но вот что ответил по этому поводу Photoshop (внизу сообщения: 1 - без эффекта, 2 - с ним).

Я специально сделал эффект побольше, чтобы было заметно. Добавлю здесь, что в 3D Max'е этот эффект делается немного по-другому и по-другому он выглядит. Достигается там это за счет размытия и осветления изображения (постобработка). Впринципе, в Photoshop'е изображение тоже предварительно размывается, но на деле выглядит менее объемно.
Изображения
Тип файла: jpg 1.jpg (45.8 Кб, 212 просмотров)
Тип файла: jpg 2.jpg (43.0 Кб, 202 просмотров)
ZotaC вне форума Ответить с цитированием
Старый 05.08.2010, 11:47   #5
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

В трехмерной графике это называется bloom-эффект или ещё это может быть эффектом HDR, но это труднее.
Сделать можно например так:
рендер в текстуру шейдером с отсечением пикселей с недостаточной светимостью, при этом текстуру делать раза в 2 меньше viewport'а, затем наложить на экран (растянуть), получится размытое засветление нужных участков.
Изобретатель велосипедов

Последний раз редактировалось Selestis; 05.08.2010 в 11:52.
Selestis вне форума Ответить с цитированием
Старый 05.08.2010, 12:25   #6
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Пример блума есть с ссылке что я давал(правда он там не особо хорошо сделан):


Делается все как написал Selestis, только у меня вместо растяжения изображение размывается шейдером блюра.
Вадим Буренков вне форума Ответить с цитированием
Старый 05.08.2010, 12:28   #7
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Цитата:
размывается шейдером блюра
Можно и так, но что-то мне подсказывает, что RTT будет быстрее. Хотя не факт, зависит от шейдера.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 06.08.2010, 16:23   #8
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Вот такой вопрос еще возник. При использовании этого кода:

Код:
  glEnable(GL_BLEND);
  glBindTexture(GL_TEXTURE_2D, White);
  glBegin(GL_QUADS);
    glColor4f(1, 1, 1, Alpha);
    glTexCoord2f(0, 1);
    glVertex2f(0, 0);
    glTexCoord2f(1, 1);
    glVertex2f(600, 0);
    glTexCoord2f(1, 0);
    glVertex2f(600, 600);
    glTexCoord2f(0, 0);
    glVertex2f(0, 600);
  glEnd;
  glDisable(GL_BLEND);
экран сначала весь белый (White - переменная с белой текстурой), потом плавно переходит в нормальный вид и сразу же за тем - в черный. В чем может быть проблема?

Alpha - переменная, которая при загрузке программы принимает значение 1, а далее, в таймере - Alpha := Alpha - 0.01. Вообще вот весь код таймера:

Код:
  Alpha := Alpha - 0.01;
  glViewPort(0, 0, ClientWidth, ClientHeight);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  Quads(DC, Fon, Point(0, 0), Point(600, 600));
  Quads(DC, Image, Point(250, 250), Point(350, 350));
  TextOut(300, 300, 'Текст);

  glEnable(GL_BLEND);
  glBindTexture(GL_TEXTURE_2D, White);
  glBegin(GL_QUADS);
    glColor4f(1, 1, 1, Alpha);
    glTexCoord2f(0, 1);
    glVertex2f(0, 0);
    glTexCoord2f(1, 1);
    glVertex2f(600, 0);
    glTexCoord2f(1, 0);
    glVertex2f(600, 600);
    glTexCoord2f(0, 0);
    glVertex2f(0, 600);
  glEnd;
  glDisable(GL_BLEND);

  SwapBuffers(DC);
Вот код процедуры Quads:

Код:
Procedure Quads(var DC: HDC; Image: glUInt; LU, RD: TPoint);
begin
  glEnable(GL_BLEND);
  glBindTexture(GL_TEXTURE_2D, Image);
  glBegin(GL_QUADS);
    glTexCoord2f(0, 1);
    glVertex2f(LU.X, LU.Y);
    glTexCoord2f(1, 1);
    glVertex2f(RD.X, LU.Y);
    glTexCoord2f(1, 0);
    glVertex2f(RD.X, RD.Y);
    glTexCoord2f(0, 0);
    glVertex2f(LU.X, RD.Y);
  glEnd;
  glDisable(GL_BLEND);
end;
ZotaC вне форума Ответить с цитированием
Старый 06.08.2010, 16:29   #9
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

У Quads не указан цвет отрисовывающегося примитива, поэтому когда цвет альфы достигает нуля ВСЕ объекты становятся абсолютно прозрачными и мы видим черный фон. Добавьте в квады определение цвета.
P.S. Не факт что я прав, но мне кажется это может быть причиной
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 06.08.2010, 17:35   #10
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Да, спасибо, именно это и было проблемой.
ZotaC вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Визуальные эффекты в программе SKS Мультимедиа в Delphi 12 19.01.2011 08:31
Эффекты к имиджу Marsik Помощь студентам 31 08.01.2010 16:45
Эффекты окон BOBAH13 Мультимедиа в Delphi 1 03.10.2008 08:49
Эффекты картинок Andrey1433 PHP 1 17.03.2008 02:07
Визуальные эффекты... ~N@um~ Помощь студентам 2 11.12.2007 11:15