LINUX.ORG.RU

glsl правильное смешивание цветов diffuse + reflecting + refracting

 , , , ,


0

1

есть у меня диффузный цвет текстуры

vec4 diffuse = texture2D(diffuse_map, uvs);

есть цвет отражения из кубической карты и уровень отражения

float reflecting = 0;
reflecting = get_from_chanel(uvs,reflecting_map,reflecting_chanel) + reflecting_level;
vec3 env_map_reflect = textureCube(envcube_map, reflect(fPosition - cam_pos,normalize(fNormal))).rgb;

есть цвет переломления от кубической карты и уровень переломения

float refracting = 0;
    refracting = get_from_chanel(uvs,refracting_map,refracting_chanel) + refracting_level;

float ratio = 1.00 / refracting_level;
vec3 env_map_refract = textureCube(envcube_map, refract(fPosition - cam_pos,normalize(fNormal),ratio)).rgb;

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

  • 1 свет преломления проходит через модель и преломленый цвет окружения смешивается с цветом диффузной карты
  • 2 в это же место идёт свет от отражения и смешивается с цветом на предыдущем этапе
  • 3 итоговый цвет попадает в глаз

Только вот глазам от этого больно )))))))))

Если просто смешивать отдельно отражения или преломления с диффузным цветом то всё ок, например смешаем отражения с уровнем отражения и диффузным цветом

gl_FragData[0].rgb = mix(diffuse.rgb,env_map_reflect,reflection);  // reflection = 0.5 из uniform к примеру

получим отражения окружения в соотвецтвии с текстурой отражений и будут места где отражения есть, а где их нет с разной интенсивностью, тоже самое с переломлениями. НО! как смешать и отражения и переломления и диффуз нормально ума не приложу всё херня получается. Вот есть у нас шарик мы в него глядим такие, шарик у нас позрачный и синий мы за ним стоит стол красный тоесть цвет от стола идёт сквозь шарик преломляется и смешивается с цветом синего шарика в тоже время за нами стоят башииие напольные часы фиолетовые! от них свет падает в то место где выходит преломленый лучик из шарика от стола и с космической скоростью весь этот компот попадает в глаза. И видим мы, синий шар в котором искажённый стол который стоит за ним и видим часы которые отражаются на поверхности шара ибо он и прозрачный и блестящий одновременно….

Цвета мне как смешать пральна? Ась? Вот хрен его знает, вернее хрен знает что есть mix, но вопрос в том как правильно?

Deleted

Последнее исправление: Deleted (всего исправлений: 3)

Даже такие базовые вещи для лора это слишком. Местынй максимум это глбегин() гдлролайнес() гленд().

anonymous
()

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

Для себя сделал так: Может кому будет полезно


// учитывая псевдопрозрачность по отношению к карте окружения
// смешиваем переломленный цвет с диффузным цветом, хотя на самом деле 
// надо наоборот, но я сделал так разница не сильно заметна (учитывая общий компромиссный подход)
vec3 target_color = mix(diffuse.rgb,env_map_refract,transparency_level);
// затем на полученный цвет накладываем цвет отражения из карты окружения
// получив в итоге целевой цвет для gl_FragColor.rgb который и рисуем по итогу
     target_color = mix(target_color,env_map_reflect,reflecting);

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

По итогу плоский кубик с параллаксом + пустой диффузный цвет + отражения + переломления даёт вот такой вот результат https://youtu.be/WCwsCoxM6FA (там гамма увеличена, забыл убрать ну да ладно)

Теперь если добавить динамический cubemap вокруг то будут преломения и отражения всего окружения, но тут тест без всего этого. Ну вроде всё может кому пригодится.

Deleted
()
Ответ на: комментарий от Deleted

Вот ещё рендер, тут намного лучше видно что такой хоть и тупой наверное подход даёт нормальный такой результат, самое главное всё работает достаточно быстро https://youtu.be/H66P-y2Bhe8

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.