Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / как правильно рассчитывать освещение с тенями для нескольких переотражений ? (8 стр)

как правильно рассчитывать освещение с тенями для нескольких переотражений ? (8 стр)

Поделиться

Страницы: 1 2 3 4 ... 7 8 9 Следующая

SuslikМодераторwww8 окт. 20173:09#105
itmanager85
> правда просто перемножать цвета отражений не выйдет - т.к. сильно затемняется
> изображение (в отражениях)
ну а ты как думал? ты не поверишь, но именно так и происходит в реальной физике, ты не должен получать бесконечной цветной мозайки в отражениях. на вот тебе гейское фото в доказательство того, что в красном шаре не может отразиться зелёный цвет, ну то есть вообще:
Изображение
можно видеть, что в зелёном отражаются другие цвета, потому что этот зелёный — вовсе не (0, 1, 0), а что-то вроде (0.5, 1, 0.5)

Изображение
itmanager85
> пришлось домножать цвет каждого последующего отражения на глубину отражения (1
> - первое попадание лучше из экрана, 2 - первое отражение и т.д.).
брехня, энергия не сохраняется. физику менять, если тебе результат не нравится, вместо того, чтобы ошибку искать — это, конечно, лол.

ещё у тебя совершенно не физичный какой-то specular блик, убери его к чёрту. предупреждая твой вопрос "а как же тогда получить корректный блик"? ответ однозначный — через glossy reflections, то есть через много сэмплов path tracing'а, иначе будет в любом случае фейк. specular блик — это размытое отражение источника света, я у тебя вообще никакого источника света не вижу. он должен сходиться как-то так:
Изображение
а когда сойдётся — примерно так:
Изображение
в этих скринах источник света — это точно такой же шар, просто светящийся. ничем не отличается от остальных.

Правка: 8 окт. 2017 3:26

MrShoorУчастникwww8 окт. 20179:09#106
Suslik
> физику менять, если тебе результат не нравится, вместо того, чтобы ошибку
> искать — это, конечно, лол.
Да там ошибку даже искать не надо, просто ткнул пальцем в его код и сразу попал. Прошу приветствовать, функция кука торренса:
+ Показать

Найдите упоминание числа PI в вычислениях. Или найдите связь между количеством диффуза и отраженным спекуляром. Или найдите например зависимость спекуляра от dot(N, L).

Правка: 8 окт. 2017 9:17

itmanager85Постоялецwww8 окт. 201712:09#107
MrShoor
> Да там ошибку даже искать не надо, просто ткнул пальцем в его код и сразу
> попал. Прошу приветствовать, функция кука торренса:
>
> Найдите упоминание числа PI в вычислениях. Или найдите связь между количеством
> диффуза и отраженным спекуляром. Или найдите например зависимость спекуляра от
> dot(N, L).

ну а как должно то быть ?

если чё - я отсюда Cook-Torrance и Фонг'а взял .. :D
http://steps3d.narod.ru/tutorials/lighting-tutorial.html

Правка: 8 окт. 2017 12:27

MrShoorУчастникwww8 окт. 201723:39#108
itmanager85
> ну а как должно то быть ?
Ты хочешь готовый код, который ctrl+C/ctrl+V? Или тебе нужны подробные объяснения?

> если чё - я отсюда Cook-Torrance и Фонг'а взял .. :D
Я в курсе. Там, откуда ты его взял - он с кучей ошибок.

itmanager85Постоялецwww9 окт. 20172:00#109
MrShoor
> Ты хочешь готовый код, который ctrl+C/ctrl+V? Или тебе нужны подробные
> объяснения?

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

ну и ко всему прочему через "ctrl+C/ctrl+V" всё равно с нахрапа без понимания сути не удастся добиться корректного освещения , потому что оно сейчас там всё через ж.. - и держится только на костылях .. :D

MrShoorУчастникwww9 окт. 20177:45#110
itmanager85
Тогда можешь почитать мою статью на хабре: https://habrahabr.ru/post/326852/
Там же есть примеры с исходным кодом и шейдерами.
Тебе достаточно почитать от начала до раздела 3.0 Image based lighting. Image based lighting для твоего случая не нужен.
itmanager85Постоялецwww9 окт. 201716:02#111
MrShoor
> Тогда можешь почитать мою статью на хабре: https://habrahabr.ru/post/326852/
> Там же есть примеры с исходным кодом и шейдерами.

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

если просто прибавлять полученную интенсивность через к диффузному цвету поверхности 

+ Показать

то получается вот такая картина

+ Показать

бинарники + cl файл [обновлено - ver.2.2.9] (CookTorrance_GGX)
https://yadi.sk/d/wJfgBctJ3NbZcJ

результирующий цвет (с освещённостью) умножается на аналогичный показатель от отражения

+ Показать

но выходит что отражения получаются тёмными ..

хотелось бы услышать как можно привести изображение к более правильному виду ..

MrShoorУчастникwww9 окт. 201718:26#112
itmanager85
> хотелось бы услышать как можно привести изображение к более правильному виду ..
Дать больше света. Результат записывать в float текстуру и делать тонмаппинг.
MrShoorУчастникwww9 окт. 201718:31#113
itmanager85
> если просто прибавлять полученную интенсивность через к диффузному цвету
> поверхности 
Какой диффузный цвет? Чо за бред. Нет в pbr диффузного цвета. Есть только альбедо, и ты его уже передаешь в материале.

Правка: 9 окт. 2017 18:33

itmanager85Постоялецwww9 окт. 201719:26#114
MrShoor
> Какой диффузный цвет?
а как с диффузным цветом материала миксовать pbr ("CookTorrance_GGX()") ? и вообще освещение ?

а если цветной источник освещения, то для получения итоговой освещённости в точке необходимо результат "CookTorrance_GGX()" умножить на цвет источника освещения , или как ?

+ Показать

Правка: 9 окт. 2017 19:26

MrShoorУчастникwww9 окт. 201720:18#115
itmanager85
> а как с диффузным цветом материала миксовать pbr ("CookTorrance_GGX()") ? и
> вообще освещение ?
Ты статью читал вообще? А именно - раздел 2.7 Lambertian модель рассеянного света. Диффузный цвет - это альбедо. И у меня оно уже учитывается:
    float3 specK = G*D*F*0.25/(NV+0.001);    
    float3 diffK = saturate(1.0-F);
    return max(0.0, m.albedo*diffK*NL/PI + specK);

itmanager85
> а если цветной источник освещения
Да, умножать на свет источника.

itmanager85Постоялецwww9 окт. 201721:01#116
MrShoor
> Ты статью читал вообще? А именно - раздел 2.7 Lambertian модель рассеянного
> света.
читал

MrShoor
> Диффузный цвет - это альбедо.
что то батенька не клеится в вашей схеме ,

если заменить параметр альбедо цветом материала ,

+ Показать

то получается херня

+ стало
+ было

если перемножать

m.albedo = mat.diffuse.xyz * (float3)( 0.01f, 0.01f, 0.01f );

то тоже получается такая же хрень как на первой картинке ("стало")

MrShoorУчастникwww9 окт. 201721:23#117
itmanager85
> то получается херня
Потому что у тебя почти все отражается:
m.f0 = (float3)( 255, 219, 145 ) * (1/255.0f);
И на долю диффузного переизлучения остаются крохи, которые ты собственно и видишь как немного разные оттенки.
Кстати сейчас эта херня выглядит достаточно годно, и стала больше похожа на реальный металл. Дать раз в 5 больше света, и сделать тонмаппинг и вообще стильная сценка выйдет.

Еще раз, вот это:

m.f0 = (float3)( 255, 219, 145 ) * (1/255.0f);
количество света, который материал отражает. А все что он не отражает - он переизлучает с m.albedo.

Ты можешь свой mat.diffuse.xyz в принципе запихнуть в f0, и тогда твой "металл" будет отражать именно эту долю света:

m.albedo = 0.1;
m.f0 =  mat.diffuse.xyz;

А можешь f0 сделать маленьким, а диффуз запихнуть в альбедо:

m.albedo = mat.diffuse.xyz;
m.f0 = (float3)( 40, 40, 40 ) * (1/255.0f);
И получешь цветной диелектрик.

Правка: 9 окт. 2017 21:24

itmanager85Постоялецwww10 окт. 20170:55#118
MrShoor
> Ты можешь свой mat.diffuse.xyz в принципе запихнуть в f0, и тогда твой "металл"
> будет отражать именно эту долю света:
>
> m.albedo = 0.1;
> m.f0 = mat.diffuse.xyz;
+ вот с таким кодом 1


MrShoor
> А можешь f0 сделать маленьким, а диффуз запихнуть в альбедо:
>
> m.albedo = mat.diffuse.xyz;
> m.f0 = (float3)( 40, 40, 40 ) * (1/255.0f);

+ вот с таким кодом 2

т.е. даже на выкрученном (до явных засветов) ambient_color до (0.3f,0.3f,0.3f) - всё равно отражения получаются тёмными ..

из чего делаем вывод что мультипликативный блендинг для отражений не подходит  (привет суслику :D )

вот так он сейчас выглядит ..

hit_r.color *= rez_color;

MrShoorУчастникwww10 окт. 20172:53#119
itmanager85
> такая картинка
Отсутствие sRGB вижу я.

> из чего делаем вывод что мультипликативный блендинг для отражений не подходит (привет суслику :D )
Все там подходит. Просто нужна нормальная сцена. И кстати ambient-а быть не должно в PBR. Ибо ambient - это костыль, который будет смотреться в любом случае убого. Ты конечно можешь добавить ambient, но добавлять вот так:

      float3 ambient_color = (float3)(0.3f,0.3f,0.3f);
      rez_color += ambient_color;
Это полное говно. В твоем случае надо делать как минимум вот так (и станет намного лучше):
      float3 ambient_color = (float3)(0.3f,0.3f,0.3f) * mat.diffuse.xyz;
      rez_color += ambient_color;
Но все равно ambient это говно. Нужно делать больше источников либо Image Based Lighting.

> всё равно отражения получаются тёмными
Они и будут темными. Смотри выше пример суслика с фотографиями. Ты либо делаешь физичный рендер, либо нет. Выбирай. Кстати твой скрин со "светлыми" отражениями смотрится убого и нереалистично. Ну еще и баги с бликами по границам тоже доставляют.

Что можно сделать:
1. Запилить поддержку sRGB. Это просто мастхев в любом случае.
2. Сейчас у тебя один точечный источник (даже не сфера). В большинстве случаев оно будет смотреться убого. Я бы смотрел в сторону Image Based Lighting, но это достаточно сложная тема. Там в моей статье дальше расписано что да как. Но можно просто больше источников света накидать с разных сторон. Будет конечно больше бликов, но и освещение будет "ярче" со всех сторон.
3. Дать больше света, писать в HDR и делать тонмаппинг.

Правка: 10 окт. 2017 2:53

Страницы: 1 2 3 4 ... 7 8 9 Следующая

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр