Короче я потыкал, можно получить источник света, которые не увеличивает яркость пикселей вне тени, а наоборот уменьшает (для этого задал brightnress = -1).
То есть вклад источника света может быть отрицательным. Поэтому ПРИМЕРНЫЙ план действий может быть такой:
Добавляешь в Renderer.cpp новый тип исчтоника света (фактически цель этого, чтобы передать в шейдер твой собственный DEFINE), там уже есть:
Дефайн может быть что-то вроде PERPIXEL POINTLIGHT SHADOW NEGATIVE.
А в шейдере вместо того чтобы увеличивать яркость везде, кроме тени, уменьшаешь яркость пикселей в тени.
Для своего нового источника света сам определяешь и обновляешь позицию в игре на основе других источников света.
p.s. а легче просто нормальные тени отбрасывать ) неужели одна тень лучше нескольких?
Не, в bsp файле. Когда уровень подготавливается в редакторе они расчитываются и пишутся прям в бинарник. Так во всех bsp движках было от quake1 до Source.
Хотя в q3 есть вершинное освещение как альтеонатива лайтмапам для слабых компов.
1vanK
То есть все освещение динамическим делать?
Ну зачем все, это может быть и единсвтенаня лампа, которая не будет давать света, а будет минусовать яркость пикселей в области тени
EDIT: понял, ты насчет предложения о куче теней, ну тогда да, надо движок копать
Кстати раз в сцене гарантированно один источник света будет, то можно движок не изменять, а просто в шейдере LitSolid в секции PERPIXEL SHADOW изменить пару строчек и все
EDIT: я имею в виду, раз нет риска испортить поведение обычных источников света
Измененный шейдер litsolid:
#ifdef HEIGHTFOG
float fogFactor = GetHeightFogFactor(vWorldPos.w, vWorldPos.y);
#else
float fogFactor = GetFogFactor(vWorldPos.w);
#endif
// Начало измененного кода
#if defined(PERPIXEL)
// Per-pixel forward lighting
vec3 lightColor;
vec3 lightDir;
vec3 finalColor;
#ifdef SHADOW
finalColor -= (1.0 - GetShadow(vShadowPos, vWorldPos.w)) * 0.3;
#endif
#ifdef AMBIENT
finalColor += cAmbientColor.rgb * diffColor.rgb;
finalColor += cMatEmissiveColor;
gl_FragColor = vec4(GetFog(finalColor, fogFactor), diffColor.a);
#else
gl_FragColor = vec4(GetLitFog(finalColor, fogFactor), diffColor.a);
#endif
// конец измененного кода
#elif defined(PREPASS)
// Fill light pre-pass G-Buffer
float specPower = cMatSpecColor.a / 255.0;
Сцена освещена только фоновым освещением, источник света не увеличивает яркость, а вычитает яркость в области тени:
>Не, в bsp файле. Когда уровень подготавливается в редакторе они расчитываются и пишутся прям в бинарник. Так во всех bsp движках было от quake1 до Source.
по мне так проще взять из данных геометрии уровня (BSP) только сетку + UV для текстур, и забейкать источники для Ухи в том виде в котором двиг рассчитывает их получать.
Спасибо всем! Покопаю, покажу что получилось.
Что я делаю не так?

Это переделанное стандартное демо про регдолы. Если я кидаю много шаров то текстуры начинают глючить, потом начинает глючить источник света.... Такое ощущение что где-то буфер переполняется и он начинает портить соседнюю память.
Лог смотри, похоже где-то в шейдере несуществующая текстура используется
1vanK
[Mon Sep 12 22:07:54 2016] INFO: Opened log file Urho3D.log
[Mon Sep 12 22:07:54 2016] INFO: Created 3 worker threads
[Mon Sep 12 22:07:54 2016] INFO: Added resource package E:/MyWork/urhosharpeditor/src/UrhoSharpEditor/bin/Debug/CoreData.pak
[Mon Sep 12 22:07:54 2016] INFO: Added resource path E:/MyWork/UrhoGamePrototype/Data/
[Mon Sep 12 22:07:55 2016] INFO: Set screen mode 1920x1080 fullscreen
[Mon Sep 12 22:07:55 2016] INFO: Initialized input
[Mon Sep 12 22:07:55 2016] INFO: Initialized user interface
[Mon Sep 12 22:07:55 2016] INFO: Initialized renderer
[Mon Sep 12 22:07:55 2016] INFO: Set audio mode 44100 Hz stereo interpolated
[Mon Sep 12 22:07:55 2016] INFO: Initialized engine
[Mon Sep 12 22:07:55 2016] INFO: Loading scene from Scenes/map.xml
[Mon Sep 12 22:07:55 2016] WARNING: StaticModel::SetModel() called on AnimatedModel. Redirecting to AnimatedModel::SetModel()
Не вижу подозрительного ничего.
СТенкам другой материал выстави и посмотри будет мигать или нет
А я правильно понял, что у тебя на стенках материал с картой нормалей? Для такого материала в вершинах должна храниться информация о тангентах, а если ты экспортнул модель из квейка, то тебе их самостоятельно надо рассчитать (или не использовать материал с картами нормалей)
1vanK
Похоже что ты прав. А чего он не ругается что не хватает какого-то аттрибута? :(
Без текстур или с материалом только с дифузной картой работает отлично.
Ну попробуй открой issue, чтобы варнинг в лог писало :)
Тема в архиве.