Перейти к содержимому


Свернуть чат Чат Открыть чат во всплывающем окне

Yakim (Watco... : (2 дней назад) бугага
lz : (5 дней назад) Вытаскивал из блока.
lz : (5 дней назад) Блэт, мои серваки на амазоне под раздачу попали.
Yakim (Watco... : (2 недель назад) :ph34r:
Гость : (4 недель назад) Благодарю :) (предпочитаю постоянный стабильный заработок)
Yakim (Watco... : (4 недель назад) пхахаха
lz : (4 недель назад) Может быть, хочешь знать, как поднять бабла?
lz : (4 недель назад) Кстати, а проблем с доступом к джойказино у тебя нет?
lz : (4 недель назад) Активировал.
Гость : (4 недель назад) Проблемы с активацией аккаунта на форуме... =)
Yakim (Watco... : (19 Март 2018 - 21:37) :ph34r:
Yakim (Watco... : (01 Февраль 2018 - 21:44) ?
Yandersen : (01 Февраль 2018 - 19:04) Проблемы?..
Yakim (Watco... : (31 Январь 2018 - 13:18) Какие проблемы?
lz : (30 Январь 2018 - 16:17) Какие проблемы? Проблемы с другими движками?
GranMinigun : (30 Январь 2018 - 12:45) Где я предлагал заняться рефакторингом? Я спрашивал, в чём именно проблемы.
Гость : (30 Январь 2018 - 07:55) пускай они там как нибудь сами, без меня)
GranMinigun : (29 Январь 2018 - 21:19) Анрил с видимым исходным кодом таки. Но да, у СруДвижка только сырцы самого движка и свободны. А что конкретно за проблемы в коде СруДвижка? Я видел, что у них в планах провести рефакторинг в ближайший апдейт или два. С точки зрения инструментария, к слову, СруДвижок серьёзно подтянулся в последних версиях, я даже решил таки поближе ознакомиться. (А вообще, мне он понравился графическими технологиями, особенно подходом к освещению.)
Yakim (Watco... : (29 Январь 2018 - 18:01) люто плюсую Егор)
lz : (29 Январь 2018 - 14:29) Движок большой, функционала много, код качественный (не как у крузис енгине) и всё такое.
lz : (29 Январь 2018 - 14:28) Анреал открытый, взрослый, на С++. Пока проект некоммерческий денег заносить никому не надо.
lz : (29 Январь 2018 - 14:27) Да не, на самом деле у меня даже где-то описано, что графический движок можно заменить при необходимости.
lz : (29 Январь 2018 - 14:27) Потому что анреал - офигенная тема.
GranMinigun : (29 Январь 2018 - 01:03) Кстати, Егор. А почему выбор движка пал именно на UE4? Какие-то предпосылки к этому были?
lz : (27 Январь 2018 - 18:39) Я подумал на карту механоидов побольше добавить для фана, а надо ж запаковывать ещё.
lz : (27 Январь 2018 - 18:39) Спс, это я и писал)
GranMinigun : (27 Январь 2018 - 18:20) Только распаковщик. Сторонний. Точнее, его создал lz.
Гость : (27 Январь 2018 - 03:45) а интересно, есть ли где упаковщик для м1? в сдк или может где встроен в саму игру или редактор
Folgen : (19 Январь 2018 - 08:31) Спс.
GranMinigun : (19 Январь 2018 - 05:43) Готово. Добро пожаловать на форум, механоид.
GranMinigun : (19 Январь 2018 - 05:42) Указать, кого именно активировать, например.
Гость : (19 Январь 2018 - 00:49) Активируйте акк. Хз, нужно что-либо указывать дополнительно для этого в чате, или админы сами всех подряд активируют, кто в очереди на активацию?
GranMinigun : (13 Январь 2018 - 05:42) https://forums.unrea...sed-on-gis-data
Yakim (Watco... : (09 Январь 2018 - 00:24) Аа да? Ну окей)
GranMinigun : (08 Январь 2018 - 20:06) А это даже не обсуждается!
Yakim (Watco... : (08 Январь 2018 - 19:55) А кто сказал что мы пьянели?)
GranMinigun : (08 Январь 2018 - 19:48) Ну что, товарищи, протрезвели?
Yakim (Watco... : (02 Январь 2018 - 20:56) сяп)
Гость : (01 Январь 2018 - 23:57) Егорыч на праздники с каникул вернулся. За это тост! Всем маны!
lz : (30 Декабрь 2017 - 23:52) Наоборот.
Гость : (30 Декабрь 2017 - 23:16) Позвольте уточнить, для будущего наркомана прошлое это будущее или наоборот?
lz : (30 Декабрь 2017 - 22:08) Как ты его поймаешь, когда он знает, где ты его будешь ловить?
GranMinigun : (30 Декабрь 2017 - 09:12) Ловите наркомана из будущего!
PA3UJIb : (30 Декабрь 2017 - 06:37) С новым 2018 годом! А то старый-то 2018 мы и не видели даже
Yakim (Watco... : (29 Декабрь 2017 - 19:46) С наступающим)

Фотография
- - - - -

Моделирование освещения

graphics ray tracing rasterization lighting

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 27

#1 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 09 Декабрь 2014 - 20:21

Давненько не встречал таких качественных, классных, доступных для понимания наглядных презентаций:

Background: Physics and Math of Shading

Отлично объясняет магию света и её моделирование в компьютерной графике, советую всем насладиться.  :)

 

Кстать, на с.55 там дана таблица цветов некоторых металлов.



#2 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 10 Декабрь 2014 - 18:46

Круто.

Я как раз только точечный источник света докурил. По модели Фонга.

Долго крутил график затухания света и нашел несколько интересностей. Можно оказывается сделать максимум света на некотором расстоянии от источника. Можно превратить точечный источник в амбиентный, без затухания. Там всего-то три константы.


 


#3 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 10 Декабрь 2014 - 20:40

Только не говори, что ты засел на первых глях и куришь АПИ светильников. В новых глях всё это убрали - в шейдерах как хочешь освещение прописывать можно, никаких встроенных переменных для структур светильников больше нет начиная с 3-й версии. Точечный светильник можно так охарактеризовать:

 

vec3 LightPosition; //xyz

vec3 LightIntensityAt1meter; //RGB

 

Дальше для вычислении интенсивности освещения в интересующей тебя точке, в вершинном (или прямо в пиксельном) шейдере прописываешь так:

 

vec3 PointPosition; //xyz

vec3 PointToLight = PointPosition - LightPosition;

vec3 IntensityAtPoint = LightIntensityAt1meter / dot( PointToLight, PointToLight );

 

В жёстком функционале там какие-то обрезки в диапазон 0...1 были и другие костыли. В шейдерном варианте ты ничем не связан - что подал в униформу, то шейдер и будет юзать. Так что цвет можно (и нужно) зашкаленный за единицу пихать.



#4 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 10 Декабрь 2014 - 21:08

Только не говори, что ты засел на первых глях и куришь АПИ светильников

Нет, конечно.
В общем выходит, что материал это 4 цветовых вектора + 2 коээфициента - прозрачность и блеск. Эти цветовые вектора умножаются на соответствующие вектора от источника, а результат уже обыгрывается параметрами затухания источника. Ща домучаю прожектор и буду искать как можно соединять источники на одном материале.


 


#5 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 10 Декабрь 2014 - 22:02

Не пойму, почему 4 цветовых вектора? У меня 3 получается:

1) diffuse (в альфу привык пихать прозрачность) - интенсивность зависит от угла падения лучей, но не зависит от угла обзора;

2) specular (в альфу логично пихнуть "gloss" - отполированность, 1 - зеркальное отражение, 0 - максимально размытый блик) цвет отражённого блика - зависит от угла падения света и угла обзора;

3) emission - интенсивность самоэмиссии (3 компоненты).

 

Амбиенту ты имел в виду как 4-й вектор? ИМХО, искусственная она слишком, эта компонента, не место ей среди материалов.



#6 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 11 Декабрь 2014 - 16:04

Ambient нужный и важный компонент. Она же представляет собой освещенность материала.

Diffuse это степень рассеяния света, а specular степень отражения. Сам же выше кинул сцыль на PDF с объяснениями - свет состоит из поглощенной части, из рассеянной части и отраженной части.


 


#7 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 11 Декабрь 2014 - 21:07

Свет из фотонов состоит. :ph34r:

diffuse и specular определяют, как материал рассеивает и отражает падающий на него под определённым углом свет от источника. А аmbient - это их статистический результат для всенаправленного освещения, т.е. от равномерно распределённых в объёме пространства светильников. Поэтому аmbient так близок по значению к diffuse. Это не физическое свойство материала, а статистическая эмпирическая величина.

Прикол в том, что точка получает свет не только от светильников, но и от всего, что ими освещается. Т.е. в реале светильников в сцене как бы бесконечное множество - их всех не обсчитаешь (разве что рэй-трэйсингом). Поэтому и ввели такое понятие, как всенаправленное-освещение - эквивалент светильника, который как будто светит на все точки сцены под всеми углами одновременно, ну и искусственная компонента аmbient - это коэффициент для света от такого светильника. Просто diffuse используй.



#8 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 12 Декабрь 2014 - 14:46

Вот сюда положу вторую демку - она как раз про свет.

Прикрепленный файл  lightDemo2.7z   1,33МБ   22 - Раз(а) скачано

Управление камерой по-прежнему WASD+QE. Вращение мышкой.

Клавиши F1-F2-F3 переключают источники света: F1 это точечный источник, F2 направленный, F3 "прожектор".

Пробел активирует курсор.

Выход по нажатию Esc или кнопке закрытия окна (ну, или Alt+F4)

Прикрепленный файл  lightDemo2_source.7z   37,02К   24 - Раз(а) скачано

Сюда же добавлю исходники

 

Сообщение отредактировал PA3UJIb: 13 Декабрь 2014 - 07:50
PA3UJIb: добавлены исходники

 


#9 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 13 Декабрь 2014 - 09:11

Малацца, Разужиб, самообучение твоё возбуждает у меня уважение, хороши коды. Я помню писюки от smt005 - вот то комедия была: конструкторы без деструкторов, опечатки, транслиты в коде, комменты, логически не связанные с копипастнутыми невесть откуда кусками кода... В общем, чувствуется, что разбираешься, вникнуть пытаешься, а не просто копировать непонятно что на скорую руку. Видимо, поэтому так упорно игноришь мои упрощающие жизнь хеадеры - хочешь всё сам изучить, да? Ну хоть FileGLSL.hpp подключи, чтоб шейдеры из файлов грузить - там автоматически окошко с дебаггерной инфой вылазит при ошибках в шейдере - хоть будешь знать, если косяк и что за косяк.

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



#10 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 13 Декабрь 2014 - 09:21

хоть FileGLSL.hpp подключи

Пойду изучать.
 
Плин, комменты бы еще по-русски, а то пишешь-то ты по англицки, а слова располагаются всё равно по-русски.
...
while (true)
...
Сильная вещь - меня в своё время напинали за использование цикла
...
while (1)
{
...
};

FileGLSL.hpp подключи, чтоб шейдеры из файлов грузить - там автоматически окошко с дебаггерной инфой вылазит при ошибках в шейдере - хоть будешь знать, если косяк и что за косяк.

У меня при компиляции ошибки в логе все записываются. Просто ошибки шейдеров у меня не обрабатываются никак.

-----------------------------------------------------------------------------------------------------------------

Так, чего-то от темы ушли.
Хм, а вот на такой вопрос - как правильнее задавать "прожектор"? Я просто использую формулу из урока, там берется значение освещенности от точечного источника и домножается на коэффициент (косинус угла между направлением от источника и направлением самого источника, если внутри конуса прожектора, и 0, если вне конуса). А в OGRE было два угла, но как там свет себя вёл, я без понятия.
Есть ли какие соображения? А то я вчера полдня в MathCad графики строил, а найти приемлемое решение так и не смог.

Сообщение отредактировал PA3UJIb: 13 Декабрь 2014 - 10:46
добавлены комментарии в коду Шамана и вопрос про свет

 


#11 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 14 Декабрь 2014 - 05:17

Я просто использую формулу из урока, там берется значение освещенности от точечного источника и домножается на коэффициент (косинус угла между направлением от источника и направлением самого источника ...).

Результат можешь ещё в степень возвести, чтоб чётче границы были. А вообще, лучше сделать 1Д текстуру одноканальную, координатой входа в которую будет значение косинуса (между направлением на точку и направлением фокуса), а цвет результата - это соответствующий коэффициент. Таким образом сможешь задать желаемое соответствие между  углом и коэффициентом затухания света. Сможешь относительно чёткую границу сделать, или плавную; трёхканальную текстуру если применишь, то сможешь эмулировать разложение света на волны на границах конуса (красноватый ореол).

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

 

Но вообще лучше просто взять точечный источник как есть и накладывать на результат 2Д текстуру маски с белым кругом на ней или всякими разноцветными козявками на эмулируемом стекле фонаря.  :)



#12 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 24 Декабрь 2014 - 17:25

Добавил плавное затухание по краям пятна от источника света типа "прожектор"

Было:

lightDemo2_screen00.png

Стало:

lightDemo2_screen01.png

или так даже лучше

lightDemo2_screen02.png

 

По мне так приятнее, как-то реалистичнее светит.


 


#13 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 09 Январь 2015 - 13:15

Пытался тут перед НГ отчебучить тени с помощью shadowmap. Точнее с прорисовкой сцены в отдельную Depth-текстуру, а потом ее использовании при рендеринге основной сцены.

Вот такой вопрос. Точнее, даже пожелание. Что такое FBO? В чем, так сказать, его физический смысл? А то использовать вроде использую, но надо бы конкретно понять, что оно такое.


 


#14 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 10 Январь 2015 - 10:58

FBO - это такой объект, который указывает, куда и как видюхе рендер выводить. По дефолту выпись идёт в ту область видеопамяти, которая сливается на моник. Но можно перенаправить и переконфигурить вывод на любую другую область видеопамяти - например, в текстуру чтоб рисовало. Или сразу в несколько текстур одновременно. FBO объединяет и описывает все таргеты для рисования.

Йищчё?  :)



#15 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 16 Январь 2015 - 16:14


Йищчё?

Сильно обще. Можно и еще :)

Вообще код поправил, но не могу никак избавиться от полосы затемнения, перпендикулярной направлению источника света. Вроде всё по лекалам крою, а выходит чушНЯ одна.

Буду искать косяк - ведь по-любому где-то что не поставил, какую-нить переменную не инициализировал или еще что....


 


#16 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 16 Январь 2015 - 23:21

Ну если конкретнее, то это уже примеры использования, а ты гришь ты эти ФБО итак юзаешь. Позволь догадаться, ты хочешь ФБО в класс инкапсулировать, так что тебе хочется узнать, чего в него напихать. Ну тогда вот: 8 цветовых аттачментов, 1 буффер глубины ЛИБО 1 буффер глубины@трафарет ЛИБО 1 буффер трафарета (раздельно глубина и трафарет не поддерживаются).

Рисовка может одновременно идти в таргеты лишь одного фреймбуффера. Но не обязательно во все сразу. Функция glDrawBuffers даёт выбрать, в какие таргеты активного фреймбуффера рисовать и в каком порядке. Ну вот например если у тебя 4 текстуры приаттачено к ФБО, и ты хочешь рисовать в ту, что прицеплена к аттачмент поинту №2, то делаешь так:

 

GLuint targets[4] = { GL_COLOR_ATTACHMENT2, GL_NONE, GL_NONE, GL_NONE };

glBindFramebuffer(MyFBO);

glDrawBuffers(4,targets);

 

Эквивалентно, но не так наглядно:

 

glDrawBuffers(1,targets);

 

Потому что GL_NONE - дефолт для всех неуказанных таргетов.

Можно и не рисовать цвет вообще:

 

glDrawBuffer(GL_NONE);

 

В таком случае будет писаться лишь буффер глубины, если такой аттачмент имеется.

 

О, кстать, не забудь, что glViewport не имеет никакого отношения к ФБО, так что когда переключаешься с одного ФБО на другой всегда помни вьюпорт перенастраивать. Возможно, имеет смысл размеры вьюпорта в классе ФБО хранить, кстать.

Насчёт дравбуфферов не уверен, помнит ли ФБО свои дравтаргеты, но помойму нужно указывать их каждый раз при переключении ФБО.



#17 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 18 Январь 2015 - 07:12


Позволь догадаться, ты хочешь ФБО в класс инкапсулировать

Хотеть мало, еще надо разобраться с ним до конца - не могу же зашить то, что не понимаю.


Можно и не рисовать цвет вообще:   glDrawBuffer(GL_NONE);   В таком случае будет писаться лишь буффер глубины, если такой аттачмент имеется.

Да, вот именно его я сейчас и использую для построения карты теней.


glViewport не имеет никакого отношения к ФБО

Соответственно, карта теней зависит от размеров вьюпорта, так что приходится каждый раз убивать depth-текстуру и пересоздавать ее (предварительно отцепив от FBO).


Насчёт дравбуфферов не уверен, помнит ли ФБО свои дравтаргеты, но помойму нужно указывать их каждый раз при переключении ФБО
 

Ну и FBO пока только один.


 


#18 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 18 Январь 2015 - 09:11

Разужиб, ты имеешь в виду один ФБО плюс дефолтный? Или ты прямо в дефолтный тени рендеришь и потом в текстуру сливаешь?

Соответственно, карта теней зависит от размеров вьюпорта, так что приходится каждый раз убивать depth-текстуру и пересоздавать ее (предварительно отцепив от FBO).

Это что ещё за ересь? Каким образом размер карты теней связан с размером окна (ты ведь оконные размеры вьюпорта имел в виду)?

Текстура один раз создаётся - создание объектов есть ресурсоёмкий процесс, это не для покадровых дел. Тебе нужно просто переключаться между дефолтным и созданным ФБО, рендеря в созданный только тени, а затем теневую текстуру биндить куда там надо, переключаться в дефолтный фреймбуффер и рендерить с нею. Так что создаёшь ФБО, текстуру для теней, аттачаешь её к ФБО и затем при переключении меду дефолтным и созданным ФБО только вьюпорт и драфбуфферы настраивашь.

Текстуру тени можно, кстати, один раз забиндить в текстурный слот, скажем, №7, и забыть о ней - она там всегда будет сидеть, никуда не денется. Позволяется даже читать и рендерить в одну и ту же текстуру, шо интересно. Правда не одновременно, а то неопределённый результ может быть из-за того, что не определено в каком порядке фрагменты шейдерятся - GPU ведь щтука очень многоядерная и распараллеленная.



#19 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 18 Январь 2015 - 19:44


ты имеешь в виду один ФБО плюс дефолтный?

Да, есть же дефолтный, точно, про него не сказал.


Это что ещё за ересь? Каким образом размер карты теней связан с размером окна

Ну вот так, если не менять размер текстуры, то тени не на своих местах будут. А то и вовсе пропадают


 


#20 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 19 Январь 2015 - 03:40

Ну вот так, если не менять размер текстуры, то тени не на своих местах будут. А то и вовсе пропадают
Хуита какая-то, не связаны эти события никак, если багов нет. Так что описывай довай, как там у тебя это всё происходит. И каким макароном карту тени делаешь, тоже описывай. Способов ведь туча, но как мне кажется, ты просто пирамиду видимости в экран всовываешь при рисовке тени, да?

Хоть в моих прогах теней и нет, но теорию я знаю, могу свои пять копеек вставить, чо.






Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных