Ku2zoff писал: Я думаю, что тебе надо поштудировать оптику.
Там судя по всему не в этом дело, а в том что все динамические источники света не учитывают angles и scale модели. На каком этапе это сломалось, я не знаю. Дядя Миша даже сам не знает. И похоже дело не в шейдере, а где-то в коде, т.к. это касается только студиомоделей. Это все пока, что удалось выяснить.
Я смотрел в параное 2, там по сути все точно так же за некоторыми исключениями (копипастил - все сломалось). Точно так же строится rotationmatrix. Вот и говорю, какие-то замуты с матрицами мира/модели/света, как одно к другому складывается я вообще не понимаю.
Я напомню как обстояло дело. Когда я готовил обновление для билда 0.65 (которое мог бы вообще не делать), я частично взял рендерер от паранои, чтобы не изобретать велосипед дважды. Но параноевский рендерер более требовательный к видеокарте и я об этом упоминал в теме про разработку.
И сразу же нашлась куча людей, которые возмутились - как это так? Ксаш не будет запускаться на моей замечательной встройке 1654-го года выпуска?
А вот раньше запускался! Это недопустимо! Я тогда не стал с ними спорить, прикинул как бы ужаться в лимиты и сделал это. И тогда же отписался в теме - я сделал новый билд совместимым с вашим железом, но клянусь небесным котэ, я не завидую тому, кто будет это дебажить! Так и оказалось!
А то что я не знаю - ну за минуту поисков найти ничего не удалось, а дальше я не стал разбираться. Там бесполезно копипастить из паранои, и знание оптических законов не поможет. Там фундаментальщина, которую не отдебажишь, надо просто знать в чём отличие устройства рендерера ксаш-мода от паранои.
Дядя Миша писал: как это так? Ксаш не будет запускаться на моей замечательной встройке 1654-го года выпуска?
Ага, а сейчас народ занимается PrimeXT на базе паранои и как оказалось он очень многим нужен в таком виде, хоть и требователен к видюхе еще больше (там чего уже только не прикрутили - pbr, hdr). Вот поди разбери.
Цитата:
Дядя Миша писал: ну за минуту поисков найти ничего не удалось, а дальше я не стал разбираться.
Что мне сделать, чтобы ты потратил 2 минуты хотя бы? Я уже весь рендер моделей сравнил построчно 2 раза, только толку мало. Проблема в том, что кроме тебя тут просто некому разобраться. Я бы может и перешел на прайм или параною, но я уже столько фичей сделал для мода, что переезд просто не получится.
P.S. Я сузил проблему до этих строчек в DrawLightForMeshList
Ничего делать не надо, когда-нибудь я сам найду на это время.
У тебя ведь еще далеко до релиза? К тому же, меня удивляет, почему товарищи форкеры это до сих пор не поправили. Как форкать - так они первые. А как баг исправить - немогут
Добавлено 18-12-2021 в 22:12:
Цитата:
Aynekko писал: Я сузил проблему до этих строчек в DrawLightForMeshList
Задача сводится к тому, что в m_plightmatrix. Я уже просто не помню.
Дядя Миша писал: У тебя ведь еще далеко до релиза?
Пока далеко. Буду признателен. Я вот тени от точечных источников из паранои смог перенести и доделать. И вот столкнулся с освещением от лайтов на моделях, всю малину портит.
Цитата:
Дядя Миша писал: почему товарищи форкеры это до сих пор не поправили
Не знаю, кто есть еще форкер, но полагаю они просто не доходили до этих тонкостей. Пока не будешь делать карты и тестить все досконально, не доберешься. А что насчет прайма, так там сейчас рендер из паранои 2. А там уже изначально с этим никаких проблем не было.
Добавлено 18-12-2021 в 22:17:
Цитата:
Дядя Миша писал: Задача сводится к тому, что в m_plightmatrix.
Aynekko напомни, какие именно лайты глючат и как это выражается.
А то я сел разбираться и уже забыл в чём проблема.
Добавлено 18-12-2021 в 22:42:
Если мне память не изменяет, то кажется с рескейленными моделями там фонарь не работал или что-то вроде этого. Ну так те матрицы, которые строятся для прямого скейла совершенно не годятся для обратного.
Там обратный скейл нужен - еденица делённая на него. Для каждой компоненты. В декалях я это сделал, а для света забыл совершенно.
Судя по всему, светильники не учитывают поворот модели (angles) и скейл. Я это понял после того, как сделал тени от точечных лайтов. Когда у модели скейл 1 и angles 0 0 0, свет и тени ложатся на модель идеально. Иначе - съезжает проекция тени тут же и аттенюация работает неправильно.
Посмотрел, там всё еще интереснее. Оказывается для ксаш-мода этого фикса с декалями вообще нет, но для паранои он есть. В чём тут смысл - на статик с пользовательским скейлом декаль тоже ложится не оригинального скейла.
А в зависимости от размера этого статика. Если модель ужата по одной из осей, то декаль тоже ужмётся или растянется, чего естественно быть не должно. В параное, собственно, свет считается в мировом пространстве, поэтому там не нужны обратные преобразования. Но все вот эти VectorIRotate и VectorITransform они неполноценные преобразования.
Они скейл принимают всегда еденичный. Зато быстро. Поэтому надо построить m_plightmatrix с обратным скейлом. Для еденичного разницы всё равно не будет.
Ну что увы? У нас теперь есть две матрицы. Они обе прямые, но в одной из них инверсный скейл. Значит ту вторую нужно использовать везде, где она вызвает функцию VectorIRotate или VectorITransform.
Особо ничего не поменялось. Аттенюация сменилась на обратную, теперь огромные модели наоборот видны издалека, а маленькие освещаются вплотную (раньше было с точностью наоборот).
Вот видео. Сначала тут точечный источник, закрепленный на игроке, потом показываю обычный фонарик:
Правильность наложения теней можно проверить по брашевому полу. На некоторых моделях от омнилайта она ложится правильно, потому что у них angles 0 0 0. А другие повернуты и все съезжает. Если модель лежит на боку, то тень тоже на боку будет. А от прожектора почему-то тени ложатся всегда правильно.
Видимо, потому что подход разный:
C++ Source Code:
shadow = ShadowProj( var_ShadowCoord, u_ShadowParams.xy, dot( N, L )); // прожектор
u_ShadowParams.zw, которые в диналайте, равны -pl->projectionMatrix[2][2] и pl->projectionMatrix[3][2], в параное2 так же, к слову. Видимо осталось от копипасты параноевской, так как теней от динлайтов изначально в ксашмоде не было.
Возможно тут тоже следует использовать m_plightmatrix.
Да и я не вижу что ты там делаешь, я не вижу что вообще поменялось в форке, откуда я знаю, что там происходит.
Про тени я без претензий, просто показываю наблюдение. Проекция теней от динлайта не учитывает angles модели. И скейл кажется тоже...
Цитата:
Дядя Миша писал: свет вроде как правильно начал накладываться. Он же у тебя раньше обрезался?
Да, он обрезался шейдером из-за if( spotDot < spotCos ) discard, на моделях со скейлом < 1. Сейчас вроде бы такого нет, но все равно скейл модели влияет - см. аттач, две модели, с виду они одинаковые, а по факту это 2 разные модели. Справа модель скейл 0.5, слева 1. С омнилайтом похожая ситуация. Они ведь должны освещаться идентично.
Цитата:
Дядя Миша писал: Возможно тут тоже следует использовать m_plightmatrix.
Так стало еще хуже, свет от прожектора в моделях скейлом < 1 отображается точкой в оригине модели.
Цитата:
Дядя Миша писал: Да и я не вижу что ты там делаешь, я не вижу что вообще поменялось в форке
В плане освещения вроде бы ничего критичного не менял, во всяком случае я вернул его в ксашмодовское состояние на момент 0.81 рев2. Ну разве что добавил тени от динлайтов в r_shadows.cpp. Прожектор не тронут.
Давай даже так. Я сейчас специально возьму 0.81 рев2 и буду фиксить все там. И показывать результаты.