Crystallize писал: По-моему они обе неправильно освещаются
Маленькая справа со скейлом 0.5. Маленькая слева 1. А большие ящики я не помню. Факт в том, что освещение адекватное только на скейле 1. Любой +\- и оно ломается в зависимости от того, насколько новое число далеко от единицы.
Трудно сказать, в шейдере это нужно делать или в коде… Может там сами кости изначально неправильно работают. С другой стороны, тогда бы и скейл не работал. Эхх
Там поидее скейл матрицы ориентации модели почему-то не применяется при рендеринге освещения, хотя и должен. Т.е. дело вообще не в шейдерах.
Я пару недель назад быстро код глянул, но сходу ничего такого не заметил.
Добавлено 03-09-2021 в 18:49:
Кстати. Там может еще куллинг неверно работать, например в
Я вот тоже так думаю…сколько ни возился с шейдерами, так или иначе приходил к исходному результату. Может где-то в DrawLightForMeshList что-то не так? В параное там все по-другому обставлено, не получилось разобраться.
Вот еще в шейдере я находил такое, что float dist = length( var_LightVec ) напрямую влияет на освещение (картинка в аттаче. Вектор этот var_LightVec = ( u_LightOrigin.xyz - position.xyz ). Я так понимаю lightorigin это фонарик. А вот position!
C++ Source Code:
vec4 position = boneMatrix * vec4( attr_Position, 1.0 );
Из чего я и сделал тогда вывод, что что-то с bonematrix.
В шейдере написано, что u_LightOrigin и u_LightDir в локальном пространстве модели. Когда они из мировых координат переводятся в локальные, скейл учитывается?
И в пиксельном шейдере замени
Cg Pixel Shader:
1
L = normalize( u_LightDir.xyz );
2
3
// spot attenuation
4
float spotDot = dot( normalize( var_LightVec ), L );
на
Cg Pixel Shader:
1
L = normalize( var_LightVec );
2
3
// spot attenuation
4
float spotDot = dot( normalize( u_LightDir.xyz ), L );
В ксашмоде меши трансформируются через матрицу модели что ли? По-моему, в паранойе это сделано через кости.
Я не вижу в этом коде скейла, он включен в m_protationmatrix?
Да. Вся эта замута для экономии юниформов.
Ксаш мод запускается там, где Параное их уже не хватает.
Добавлено 04-09-2021 в 22:23:
Если вдруг непонятно - вспоминайте. я вас спрашивал тогда.
Можно хранить матрицу кости, это 12 флоатов или 3 vec4.
Можно хранить кватернион + позицию, это 7 флоатов.
Я их пишу в линейный массив из vec4.
Но. Скейл при таком подходе уже не передать. Zhopa!
Но можно сделать следующее - скейл у нас только в руте, значит мы можем передать его вместе с рутовой матрицей, а трансформацию связки кватернион + оригин выполнить прямо в шейдере.
Что я собственно и проделал. Но где-то недоглядел.
В параное этот патч тоже есть, к слову.
Странно все это. Если сделать, как в параное, то освещение всех моделей будет нормальным, только яркость не будет меняться на всем расстоянии фонарика (оно и понятно, аттенюацию же убрал). Как-то по-другому там считается, похоже, я пока не понял как.
LIGHT_PROJ в паранойе - это солнце, STUDIO_LIGHT_PROJECTION в ксашмоде - это прожектор.
Аттенюация получается неправильной из-за умножения оригина лайта на скейл модели. Надо как-то иначе сделать применение скейла. Убрать его из rotationmatrix, передавать в шейдер юниформом и сначала умножать на него, потом уже на все матрицы. Наверное.
Вопрос, не так давно начал разбираться в Ксаше и возникли проблема, когда я компилировал обычный хл всё было хорошо получал в папке релис длл файл... но с ксашам возникли проблемы, может я вообще не то делаю, но за ранние прошу не ругать за глупость, ошибка в картинке, когда открываю бат релисе да даже бекап и дебаг, на винду не смотрите она немецкая. Вообщем как комплилировать ксаш?