Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Солнце на OpenGL [Delphi, Windows]


Страницы:   1 2

Pa5ha ©   (2006-04-30 00:15:00) 

Как сделать солнце, чтоб если на него смотришь, то весь экран заливается светом? А то вот просто билборд не смотрится.

Причем в играх сделано не с помощью гаммаконтроля, текстуры, а как-то по-другому. А то вот не знаю.


Fosgen   (2006-05-15 10:42:00) [1]

2 Pa5ha:
Возьми билборд, отмасштабируй до нужного размера, затем - "размой" по примеру Xproger'а и получишь то что надо...


XProger   (2006-05-14 14:36:00) [2]

http://img118.imageshack.us/img118/2658/bloom7qj.jpg- пример работы простенького эффекта Bloom (авторTWINc)

Суть такая, рендерим всё что светится в тектуру, размазываем текстуру и выводим поверх уже отрисованного изображения с аддитивным блендингом.
Неоптимизированный пример:

procedure render_bloom;
const
 BLUR_COUNT = 8; // кол-во проходов смазывания
var
 sbuf : array [0..bw - 1, 0..bw - 1] of TRGBA;

 procedure Blur;
 var
   idx     : Integer;
   x, y    : Integer;
   R, G, B : Integer;
   dbuf    : array [0..bw - 1, 0..bw - 1] of TRGBA;

   procedure get(x, y: Integer);
   begin
     if (x > -1) and (y > -1) and (x < bw) and (y < bw) then
     begin
       inc(R, sbuf[x, y].R);
       inc(G, sbuf[x, y].G);
       inc(B, sbuf[x, y].B);
       inc(idx);
     end;
   end;

 begin
   for y := 0 to bw - 1 do
     for x := 0 to bw - 1 do
     begin
       idx := 0;
       R   := 0;
       G   := 0;
       B   := 0;
       get(x - 1, y - 1);
       get(x, y - 1);
       get(x + 1, y - 1);
       get(x + 1, y);
       get(x, y);
       get(x - 1, y);
       get(x - 1, y + 1);
       get(x, y + 1);
       get(x + 1, y + 1);
       dbuf[x, y].R := R div idx;
       dbuf[x, y].G := G div idx;
       dbuf[x, y].B := B div idx;
       dbuf[x, y].A := 255;
     end;
   Move(dbuf, sbuf, SizeOf(dbuf));
 end;

var
 i : Integer;
begin
 glViewport(0, 0, bw, bw);
 // рисуем
 glBindTexture(GL_TEXTURE_2D, Buffer);

 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, bw, bw, 0);
 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, @sbuf);
 for i := 1 to BLUR_COUNT do
   Blur;
 glTexImage2D(GL_TEXTURE_2D, 0, 4, bw, bw, 0, GL_RGBA, GL_UNSIGNED_BYTE, @sbuf);

 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 glViewport(0, 0, glWidth, glHeight);
 // рисуем
 glBlendFunc(GL_SRC_ALPHA, GL_ONE);
 // рисуем полигон с текстурой Buffer на весь viewport
end;

bw - размер текстуры


Pa5ha   (2006-05-14 13:11:00) [3]


> Что тебе мешает билборд Glow, для создания "слепящего" эффекта
> - масштабировать так как тебе надо, до требуемых величин?
>  Таким образом получишь - увеличивающуюся "заливку" начинающуюся
> от солнца...

про этот косяк я уже писал. При масштабировании появляются пиксели текстуры. Это была моя первая идея :)

http://nehe.gamedev.net/data/lessons/delphi/lesson44.zip- скачал, но к сожалению не смог оценить без набора текстур то, что хотел показать автор. У меня просто хало появляется и исчезает без эффектов =)

Радиальное размытие - интересно, можно попробовать поиграться.

Я очень ценю мнение XProger-a, но без примера я буду пытаться сделать что-нить стоящее этим методом, не зная что должно получиться в итоге до второго пришествия ;)


Fosgen   (2006-05-06 20:03:00) [4]

2: Lambda - давай выкладывай. Только сдается мне что если я выложу у себя на ресурсе, наши варианты будут несколько отличаться и опять же никто не докажет у кого - верный. Самое веселое - ты хоть понял что взбеленился именно тогда когда тебе в исходниках отказали? И до сих - пор это для тебя самое больное место - видать я точно угадал... И вообще, может пояснишь - если мой проект такой отстой, то чего же ты в первых писмах писал "в принципе, идея меня заинтересовала" (цит.) и вообще - чего лез в участники, если как ты позже писал: "нафиг не надо ни  
игрокам, ни, тем более, издателю"? Вот уж у кого проблемы с головой - сам себ противоречишь, али просто заврался? И кстати такое поведение как твое, при переписке демонстрируют исключительно подонки - я тебя кстати ни в одном письме не оскорблял и никаких эпитетов к тебе не применял. И уж тем более - не блокировал тебе возможность ответить на любые возражения. А такие твои поступки - уже просто показатель трусости.

>Pa5ha, я думаю тебе уже достаточно вариантов предложили. Решай сам какой тебе более удобен - любой из них - рабочий. Потом, можешь отмахнуться - какой дал тот эффект, что тебе требовался. А то мы тут глотки рвем друг-другу, а может все дело в неточном понимании твоих задач.


Lambda   (2006-05-06 14:15:00) [5]

Fosgen, если с головой проблемы, то нафига на форум свои помои выливать? Я ведь могу не полениться и нашу, хм.., переписку выложить на всеобщее обозрение (модератору: разумеется не на форуме :)). Не хочешь оценить реакцию здравомыслящих людей на "происки охотника за чужими сорцами"?

В принципе, о сложностях твоих отношений с собственным мыслительным аппаратом, говорит хотя бы твоя фраза из [25] поста:


> Так вот - повторяю:
> На твоих скриншотах имеется самый стандартный Glow эффект.
>


Ну что тут еще можно сказать... А то Pa5ha не знал, что у него там имеется. Вообще-то человек интересовался тем, как ему это реализовать.

Ну а теперь по-существу :)
Pa5ha, еще раз перечитай подробноеизложение [11] алгоритма создания эффекта? Потом скажи спасибо XProger'у ;)


Fosgen   (2006-05-06 08:50:00) [6]

Епрст... Pa5ha, а ты мой пост [8], где по-пунктам расписано внимательно причитал?
А то тут всякие типа Lambda, воду мутят... Ты их слушай побольше - вообще ничего не поймешь, он только крутыми терминами кидается, и пристебывается к чему попало. Потому как все за чужими исходниками охотится - ко мне тут подъезжал - пытался под видом помощи и интереса "выцыганить" сорцы моего проекта - обломался и очень за это обиделся. С тех пор - все связанное со мной обливает грязью. Так что ты на нашу перепалку внимания не обращай.
Я точно знаю как относительно дешевым способом делать твой эффект. Частично это пересекается с тем что тебе написал XProger.

Так вот - повторяю:
На твоих скриншотах имеется самый стандартный Glow эффект. Причем создается он именно так как я описывал - с учетом экранных координат источника света. Потому и получается что заливается ОТ источника света - т.е. от солнца. Для этого "размывать" всю картинку не надо - только текстуру для билборда.

http://nehe.gamedev.net/data/lessons/delphi/lesson36.zip- ссылка на пример по радиальному размытию (Radial Blur) для текстуры.

http://nehe.gamedev.net/data/lessons/delphi/lesson44.zip- реализация ВСЕХ эффектов Lens Flare( не на GLScene), связанных с источниками света, включая требуемый тебе Glow. Реализация - с учетом "перекрытия" источника света.

Что тебе мешает билборд Glow, для создания "слепящего" эффекта - масштабировать так как тебе надо, до требуемых величин? Таким образом получишь - увеличивающуюся "заливку" начинающуюся от солнца...

Мда... И шейдеры тут как мне кажется - нафиг не нужны...


Pa5ha   (2006-05-05 22:23:00) [7]

А можно чуточку подробнее?

ЗЫ.: Солнце занимает не весь экран, а маленькую его часть (обычно)


XProger   (2006-05-05 18:37:00) [8]

bloom с доп текстурами (полигон на весь экран)


Pa5ha   (2006-05-05 18:14:00) [9]

Я понимаю, что Вы имеете ввиду, но это чуточку не то. Как рисовать билборды, как рисовать хало и как проверять их видимость я знаю. Меня интересует только сам вот такой эффект, который Вы сможете найти по ниже приведенным ссылкам +)
http://sampo.ru/~pashav/files/effect/1.jpg- солнце-билборд с текстурой.
http://sampo.ru/~pashav/files/effect/2.jpg- начинает заливаться светом. Прошу заметить, что экран заливается светом по направлению от солнца, а не просто полигон на вест экран выводится.
http://sampo.ru/~pashav/files/effect/3.jpg- продолжает
http://sampo.ru/~pashav/files/effect/4.jpg- вот так выглядит солнце, которое я хочу сделать. Экран почти полностью залит светом. Причем заливается, прошу заметить от солнца, а не просто весь экран.

Все картинки весят по 10 кб. Некоторые 9. Radio Control Flight Simulator 6.01.

А есть реализация Lens flare не на ГЛСцене?


Lambda   (2006-05-05 17:06:00) [10]

Именно :)


XProger   (2006-05-05 16:51:00) [11]

Суть то одна - рендерим всё светящееся и размываем :)


Lambda   (2006-05-05 16:25:00) [12]

Fosgen, лесом будешь сам топать к своей бабушке, чтобы рассказать ей, что такое glow. Сегодняэто частный случай HDR-эффектов. И здесь, неадекватный ты наш, не форум 3D-моделеров, а форум программистов графики, поэтому я (интересно, почему?), выбираю трактовку, имеющую прямое отношение к реализации требуемого эффекта в игре, а не в среде моделирования.
Ты человеку хоть что-нибудь посоветовал, кроме не относящихся к теме бликов? Нет? Тогда не разводи флейм.

Pa5ha, думаю ты уже понял, что совет XProger'а для тебя будет лучшим решением, ну а если разживешься картой с поддержкой шейдеров, то тебе прямая дорога сюда [9]. Удачи


Fosgen   (2006-05-05 16:14:00) [13]

>XProger

Согласен. Только визуально эффекты-то будут разные все же... И если для bloom'а требуется "размытие" всей сцены, то для Glow - размытие текстуры "свечения".


XProger   (2006-05-05 14:48:00) [14]

Fosgen, эти методом можно создать оба эффекта (пусть и LDR bloom, но всё же)


Fosgen   (2006-05-05 14:31:00) [15]

>grisme ©
Размытие для немного другого эффекта - эдакого "затуманивания" сцены.

>XProger ©
Только сдается мне что glow-эффект и bloom-эффект - несколько разные вещи... Glow - исключительно от источников света зависит. А Bloom - скорее "атмосферный" эффект.

>Lambda
А ты вообще шел бы лесом... Адекватный ты наш...  Посмотрел бы как в последних версиях 3D MAX'а трактуется glow... Сравнивая две трактовки я почему-то (интересно - почему?) выбираю - MAX. А ты - никуда не уперся со своей трактовкой, однако.


grisme   (2006-05-05 14:13:00) [16]

XProger ©   (04.05.06 21:47) [11]
Глоу,насколько я помню, это же эффект "свечения",а не размытия.:-X


Lambda   (2006-05-05 11:44:00) [17]

Fosgen, я уже понял, что с адекватным восприятием у тебя определенные проблемы, поэтому еще раз отсылаю тебя к первому посту Pa5ha:

> Как сделать солнце, чтоб если на него смотришь, то весь
> экран заливается светом?

ГДЕ ты видишь "большой светящийся ореол вокруг источника света"?
Ты со своими "уникальными" идеями давно устарел, потому что glow теперь уже трактуется иначе, чем 5 лет назад, которые ты, очевидно, провел под общим наркозом.
Требуемый bloom-эффект (понятно, что фейковый) без использования шейдеров (Pa5ha, давно пора обновить систему :)) можно получить только по методу XProger [11].


Fosgen   (2006-05-05 10:10:00) [18]

>Lambda
Для тех кто трудный и недоступный - поясняю: принцип создания эффекта LensFX - именно то что надо человеку - создание Glow, Streak, Galo эффектов от солнца.
Для тех кто не знает соответствия английских терминов русским понятиям описываю:
Glow - большой светящийся ореол вокруг источника света
Streak - лучи, видимые глазом\оптикой, от источника света
Galo - светящийся круг, вокруг источника света.

Есть еще ряд эффектов, но все строятся по одному и тому же принципу - при помощи прозрачных билбордов. Как сказал XProger:"С блендингом режима - сложение".
Можно еще постобработкой отрендереного изображения, но это со своими сложностями связано.

>Pa5ha
А чтобы было красиво - и заодно - реалистично - НУЖЕН алгоритм проверки видимости источника света. Про видимость блика я не писал - внимательно прочти. А-то у тебя солнце стеной закроется, а ослепляющий (Glow) эффект от него - останется?

Насчет зернистости текстуры - либо посмотри алгоритмы в примерах, на которые я дал ссылки - там вроде есть расчет текстур в рантайме. Не сильно затратный по ресурсам. Либо тебе нужен вариант эдакого антиалиасинга.


Pa5ha   (2006-05-04 21:49:00) [19]

А как сделать чтоб на гф2 работало? :)

GLScene не знаю.


> Fosgen   (04.05.06 10:04) [8]

мне нужен не алгоритм проверки  видимости блика а собственно отрисовка солнца, чтоб красиво. На шейдерах, конечно, красиво, но мощности и ресурсы не позволяют :) Как Прогер сказал сделать то не проблема. Я так сделал. Просто при больших размерах появляется зернистость текстуры. При маленькой текстуре экран светом не заливается. Текстура из игры. В игре зернистости нет. Воть =)


XProger   (2006-05-04 21:47:00) [20]

grisme, глоу немного иначе делается :)

- рендерим сцену в текстуру мелкого размера (до 128х128)
- смазываем это дело несколько раз до нужной кондиции
- рендерим сцену на весь экран
- поверх всего этого с аддитивным наложением накладываем прозрачный полигон с нашей текстуркой

В итоге получим glow или bloom эффект (как хотите ;)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо