HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- XashXT (https://hlfx.ru/forum/forumdisplay.php?forumid=30)
-- XashXT/3D [Вопросы и ответы] (https://hlfx.ru/forum/showthread.php?threadid=3689)
Отправлено Aynekko 03-09-2021 в 10:55:
Цитата:
Crystallize писал:
По-моему они обе неправильно освещаются
Маленькая справа со скейлом 0.5. Маленькая слева 1. А большие ящики я не помню. Факт в том, что освещение адекватное только на скейле 1. Любой +\- и оно ломается в зависимости от того, насколько новое число далеко от единицы.
Трудно сказать, в шейдере это нужно делать или в коде… Может там сами кости изначально неправильно работают. С другой стороны, тогда бы и скейл не работал. Эхх__________________
Мой мод на Xash
Отправлено Дядя Миша 03-09-2021 в 11:23:
Я когда-то во время возни с обновлённым рендерером так и написал: не завидую тому, кто будет это разгребать 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ncuxonaT 03-09-2021 в 14:50:
Aynekko покажи код шейдера
Отправлено Aynekko 03-09-2021 в 15:34:
Вот, в архиве оригиналы ксашмодовские, и моя неудачная попытка что-то поправить.
__________________
Мой мод на Xash
Отправлено Дядя Миша 03-09-2021 в 15:49:
Там поидее скейл матрицы ориентации модели почему-то не применяется при рендеринге освещения, хотя и должен. Т.е. дело вообще не в шейдерах.
Я пару недель назад быстро код глянул, но сходу ничего такого не заметил.
Добавлено 03-09-2021 в 18:49:
Кстати. Там может еще куллинг неверно работать, например в
AddStudioToLightList( plight_t *pl )
C++ Source Code:
1 | Vector modelpos = m_pModelInstance->m_protationmatrix.GetOrigin(); |
2 | float dist = (pl->origin - modelpos).Length(); |
4 | if( !dist || dist > ( pl->radius + m_pModelInstance->radius )) |
7 | if( pl->frustum.CullBox( m_pModelInstance->absmin, m_pModelInstance->absmax )) |
Может absmins и absmax не предумножены на скейл. Закоментить этот участок и проверить еще раз всё.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 03-09-2021 в 16:11:
Увы, не помогло
Цитата:
Дядя Миша писал:
дело вообще не в шейдерах.
Я вот тоже так думаю…сколько ни возился с шейдерами, так или иначе приходил к исходному результату. Может где-то в 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.
Добавлено 03-09-2021 в 19:11:
Аттач__________________
Мой мод на Xash
Отправлено ncuxonaT 03-09-2021 в 17:43:
В шейдере написано, что u_LightOrigin и u_LightDir в локальном пространстве модели. Когда они из мировых координат переводятся в локальные, скейл учитывается?
И в пиксельном шейдере замени
Cg Pixel Shader:
1 | L = normalize( u_LightDir.xyz ); |
4 | float spotDot = dot( normalize( var_LightVec ), L ); |
на
Cg Pixel Shader:
1 | L = normalize( var_LightVec ); |
4 | float spotDot = dot( normalize( u_LightDir.xyz ), L ); |
К скейлу это, правда, не относится, но всё же.
Отправлено Aynekko 03-09-2021 в 19:30:
Цитата:
ncuxonaT писал:
И в пиксельном шейдере замени
Вроде что-то поменялось, а что-то и нет. Баг остался, но как будто повернулся на 90 градусов.
Насчет лайторигин, вот что в коде идет, может так понятнее будет:
C++ Source Code:
1 | m_pModelInstance = &m_ModelInstances[RI->currententity->modelhandle]; |
3 | tr.modelorg = m_pModelInstance->m_protationmatrix.VectorITransform(RI->vieworg); |
4 | Vector right = m_pModelInstance->m_plightmatrix.VectorIRotate(RI->vright); |
5 | Vector lightorg = m_pModelInstance->m_protationmatrix.VectorITransform(pl->origin); |
6 | Vector lightdir = m_pModelInstance->m_plightmatrix.VectorIRotate(pl->frustum.GetPlane(FRUSTUM_FAR)->normal); |
8 | matrix4x4 lightView = pl->modelviewMatrix.ConcatTransforms(m_pModelInstance->m_protationmatrix); |
9 | matrix4x4 projectionView = pl->projectionMatrix.Concat(lightView); |
10 | projectionView.CopyToArray(gl_lightViewProjMatrix); |
И далее:
C++ Source Code:
2 | pglUniformMatrix4fvARB(RI->currentshader->u_LightViewProjectionMatrix, 1, GL_FALSE, &gl_lightViewProjMatrix[0]); |
3 | float shadowWidth = 0.5f / (float)RENDER_GET_PARM(PARM_TEX_WIDTH, pl->shadowTexture); |
4 | float shadowHeight = 0.5f / (float)RENDER_GET_PARM(PARM_TEX_HEIGHT, pl->shadowTexture); |
6 | // depth scale and bias and shadowmap resolution |
7 | pglUniform4fARB(RI->currentshader->u_LightDir, lightdir.x, lightdir.y, lightdir.z, pl->fov); |
8 | pglUniform4fARB(RI->currentshader->u_LightDiffuse, pl->color.r / 255.0f, pl->color.g / 255.0f, pl->color.b / 255.0f, pl->lightFalloff); |
9 | pglUniform4fARB(RI->currentshader->u_ShadowParams, shadowWidth, shadowHeight, -pl->projectionMatrix[2][2], pl->projectionMatrix[3][2]); |
10 | pglUniform4fARB(RI->currentshader->u_LightOrigin, lightorg.x, lightorg.y, lightorg.z, (1.0f / pl->radius)); |
11 | pglUniform3fARB(RI->currentshader->u_ViewOrigin, tr.modelorg.x, tr.modelorg.y, tr.modelorg.z); |
12 | pglUniform3fARB(RI->currentshader->u_ViewRight, right.x, right.y, right.z); |
13 | pglUniform4fARB(RI->currentshader->u_FogParams, tr.fogColor[0], tr.fogColor[1], tr.fogColor[2], tr.fogDensity); |
__________________
Мой мод на Xash
Отправлено ncuxonaT 04-09-2021 в 19:16:
В ксашмоде меши трансформируются через матрицу модели что ли? По-моему, в паранойе это сделано через кости.
Я не вижу в этом коде скейла, он включен в m_protationmatrix?
Отправлено Дядя Миша 04-09-2021 в 19:23:
Цитата:
ncuxonaT писал:
он включен в m_protationmatrix?
Да. Вся эта замута для экономии юниформов.
Ксаш мод запускается там, где Параное их уже не хватает.
Добавлено 04-09-2021 в 22:23:
Если вдруг непонятно - вспоминайте. я вас спрашивал тогда.
Можно хранить матрицу кости, это 12 флоатов или 3 vec4.
Можно хранить кватернион + позицию, это 7 флоатов.
Я их пишу в линейный массив из vec4.
Но. Скейл при таком подходе уже не передать. Zhopa!
Но можно сделать следующее - скейл у нас только в руте, значит мы можем передать его вместе с рутовой матрицей, а трансформацию связки кватернион + оригин выполнить прямо в шейдере.
Что я собственно и проделал. Но где-то недоглядел.
В параное этот патч тоже есть, к слову.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ncuxonaT 08-09-2021 в 15:20:
Че-т я подумал, неправильно это. Не надо оригин лайта умножать на скейл модели.
Отправлено Aynekko 12-09-2021 в 13:03:
Еще обратил внимание на параноевский шейдер
C++ Source Code:
1 | #if !defined( LIGHT_PROJ ) |
2 | float dist = length( var_LightVec ); |
3 | float atten = 1.0 - saturate( pow( dist * u_LightOrigin.w, LIGHT_FALLOFF )); |
4 | if( atten <= 0.0 ) discard; // fast reject |
6 | // directional light has no attenuation |
если НЕ light_proj тут идет. В то время, как в ксашмоде
C++ Source Code:
1 | #if defined( STUDIO_LIGHT_PROJECTION ) |
2 | L = normalize( u_LightDir.xyz ); |
5 | float spotDot = dot( normalize( var_LightVec ), L ); |
6 | float fov = ( u_LightDir.w * FOV_MULT * ( M_PI / 180.0 )); |
7 | float spotCos = cos( fov + fov ); |
8 | if( spotDot < spotCos ) discard; |
9 | #elif defined( STUDIO_LIGHT_OMNIDIRECTIONAL ) |
10 | L = normalize( var_LightVec ); |
Странно все это. Если сделать, как в параное, то освещение всех моделей будет нормальным, только яркость не будет меняться на всем расстоянии фонарика (оно и понятно, аттенюацию же убрал). Как-то по-другому там считается, похоже, я пока не понял как.__________________
Мой мод на Xash
Отправлено ncuxonaT 12-09-2021 в 13:39:
LIGHT_PROJ в паранойе - это солнце, STUDIO_LIGHT_PROJECTION в ксашмоде - это прожектор.
Аттенюация получается неправильной из-за умножения оригина лайта на скейл модели. Надо как-то иначе сделать применение скейла. Убрать его из rotationmatrix, передавать в шейдер юниформом и сначала умножать на него, потом уже на все матрицы. Наверное.
Отправлено Holego|Noobito 14-09-2021 в 12:24:
Вопрос, не так давно начал разбираться в Ксаше и возникли проблема, когда я компилировал обычный хл всё было хорошо получал в папке релис длл файл... но с ксашам возникли проблемы, может я вообще не то делаю, но за ранние прошу не ругать за глупость, ошибка в картинке, когда открываю бат релисе да даже бекап и дебаг, на винду не смотрите она немецкая. Вообщем как комплилировать ксаш?
__________________
Здравомысле - удел слабых.
Отправлено Ku2zoff 14-09-2021 в 14:29:
Holego|Noobito у тебя в переменных среды отсутствуют необходимые пути. Собирай не батником, а из самой студии. Ну либо пропиши пути.