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)
Отправлено Дядя Миша 21-12-2021 в 18:19:
Цитата:
ncuxonaT писал:
var_LightVec единичный что ли?
нет, он действительно используется для затухания.
Цитата:
ncuxonaT писал:
было в паранойе, если что
В параное по другому устроено, если вы неспособны из кода понять, в каком пространстве осуществляются те или иные операции, это еще не повод бездумно копипастить в надежде, что заработает.
Aynekko сделай именно так, как я сказал. Вот почему-то уверен, что ты опустил какую-то часть операций по принципу - если станет лучше, то доделаю. А может у тебя кэши шейдеров не обновились (редко, но бывает).__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 21-12-2021 в 18:30:
Второй шейдер, с небольшими моими изменениями
C++ Source Code:
3 | float dist = length( var_LightVec ); |
4 | float atten = 1.0 - saturate( pow( dist * u_LightOrigin.w, u_LightDiffuse.a )); |
5 | if( atten <= 0.0 ) discard; // fast reject |
8 | #if defined( STUDIO_LIGHT_PROJECTION ) |
9 | L = normalize( var_LightVec ); |
12 | float spotDot = dot( normalize( u_LightDir.xyz ), L ); |
13 | float fov = ( u_LightDir.w * FOV_MULT * ( M_PI / 180.0 )); |
14 | float spotCos = cos( fov + fov ); |
15 | if( spotDot < spotCos ) discard; |
16 | #elif defined( STUDIO_LIGHT_OMNIDIRECTIONAL ) |
17 | L = normalize( var_LightVec ); |
19 | vec3 N = normalize( var_Normal ); |
21 | // compute the diffuse term |
22 | vec4 diffuse = texture2D( u_ColorMap, var_TexDiffuse ); |
24 | if( diffuse.a < 0.5 ) discard; // no glowing on tex with alpha |
26 | vec3 light = vec3( 1.0 ); |
29 | #if defined( STUDIO_LIGHT_PROJECTION ) |
30 | light = u_LightDiffuse.rgb; // light color |
32 | // texture or procedural spotlight |
33 | light *= texture2DProj( u_ProjectMap, var_ProjCoord ).rgb; |
34 | // atten *= smoothstep( spotCos, spotCos + 0.1, spotDot ) * 0.5; |
35 | #if defined( STUDIO_HAS_SHADOWS ) |
36 | shadow = ShadowProj( var_ShadowCoord, u_ShadowParams.xy, dot( N, L )); |
37 | if( shadow <= 0.0 ) discard; // fast reject |
39 | #elif defined( STUDIO_LIGHT_OMNIDIRECTIONAL ) |
40 | light = u_LightDiffuse.rgb; |
41 | light *= textureCube( u_ProjectMap, -var_LightVec ).rgb; |
42 | // light *= textureCube( u_ProjectMap, -normalize( var_LightVec )).rgb; |
44 | #if defined( STUDIO_HAS_SHADOWS ) |
46 | shadow = ShadowOmni( -var_LightVec, u_ShadowParams ); |
47 | if( shadow <= 0.0 ) discard; // fast reject |
51 | #if defined( STUDIO_FOG_EXP ) |
52 | float fogFactor = saturate( exp2( -u_FogParams.w * ( gl_FragCoord.z / gl_FragCoord.w ))); |
53 | atten = Q_mix( 0.0, atten, fogFactor ); |
55 | // do modified hemisperical lighting |
56 | float NdotL = max( (dot( N, L ) + ( SHADE_LAMBERT - 1.0 )) / SHADE_LAMBERT, 0.0 ); |
57 | diffuse.rgb *= light.rgb * NdotL * atten * DLIGHT_SCALE; |
59 | float Brightness = u_DynLightBrightness; |
60 | if( Brightness <= 0 ) Brightness = 1; |
62 | // compute final color |
63 | gl_FragColor = 2.5 * Brightness * diffuse * shadow; |
Добавлено 21-12-2021 в 21:21:
Цитата:
Дядя Миша писал:
Aynekko сделай именно так, как я сказал.
Я сделал все, что ты вчера сказал про матрицы. И вот добавил скейл в var_lightvec. Пока все.
Добавлено 21-12-2021 в 21:30:
На всякий случай
C++ Source Code:
1 | m_pModelInstance->m_plightmatrix = matrix3x4( origin, angles, Vector( 1.0f / scale.x, 1.0f / scale.y, 1.0f / scale.z ) ); |
4 | tr.modelorg = m_pModelInstance->m_plightmatrix.VectorITransform( RI->vieworg ); |
5 | Vector right = m_pModelInstance->m_plightmatrix.VectorIRotate( RI->vright ); |
6 | Vector lightorg = m_pModelInstance->m_plightmatrix.VectorITransform( pl->origin ); |
7 | Vector lightdir = m_pModelInstance->m_plightmatrix.VectorIRotate( pl->frustum.GetPlane( FRUSTUM_FAR )->normal ); |
9 | matrix4x4 lightView = pl->modelviewMatrix.ConcatTransforms( m_pModelInstance->m_protationmatrix ); |
10 | matrix4x4 projectionView = pl->projectionMatrix.Concat( lightView ); |
11 | projectionView.CopyToArray( gl_lightViewProjMatrix ); |
__________________
Мой мод на Xash
Отправлено Дядя Миша 21-12-2021 в 19:05:
Цитата:
Aynekko писал:
matrix4x4 lightView = pl->modelviewMatrix.ConcatTransforms( m_pModelInstance->m_protationmatrix );
И вот здесь еще попробуй заменить на m_plightmatrix.
Я надеюсь саму матрицу ты проинициализировал, как я говорил?
С инверсным скейлом.
Добавлено 21-12-2021 в 22:05:
И после всего сделанного ты утверждаешь, что ВООБЩЕ ничего не поменялось, вот абсолютно?__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 21-12-2021 в 19:13:
Цитата:
Дядя Миша писал:
И вот здесь еще попробуй заменить на m_plightmatrix.
Так все ломается. Свой скейл из шейдера убрал - тоже.Цитата:
Дядя Миша писал:
С инверсным скейлом.
Да, в предыдущем посте внизу перечислил все изменения.
Цитата:
Дядя Миша писал:
И после всего сделанного ты утверждаешь
Ну где же я утверждаю? Я наоборот сказал, что очень помогло. Просто после твоих изменений по матрицам я дополнительно дописал скейл в шейдер, в этот вектор. Результат всего вот этого вот показал на скринах.
Цитата:
По сути осталось разобраться с тенями от точечного. Но т.к. я их сам притащил, мог где-то ошибиться... Но проблема исключительно на моделях. Трава, браши - норм.__________________
Мой мод на Xash
Отправлено Дядя Миша 21-12-2021 в 19:34:
Цитата:
Aynekko писал:
Но проблема исключительно на моделях
Но ведь брашы и не скейлятся.
Цитата:
Aynekko писал:
я дополнительно дописал скейл в шейдер, в этот вектор.
Странно. Если позиция лайта уже в локальном пространстве с учётом скейла, то ничего этого просто не нужно. А она именно что с учётом.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ncuxonaT 21-12-2021 в 21:16:
Цитата:
Дядя Миша писал:
Странно. Если позиция лайта уже в локальном пространстве с учётом скейла, то ничего этого просто не нужно. А она именно что с учётом.
Затухание обратно пропорционально квадрату расстояния в мировом пространстве. Если переводить лайт в локальное пространство модели, разве расстояние получится равным мировому?
Отправлено Дядя Миша 22-12-2021 в 07:13:
Цитата:
ncuxonaT писал:
Если переводить лайт в локальное пространство модели, разве расстояние получится равным мировому?
с учётом того, что мы инвертировали скейл - да, должно получиться тоже самое расстояние.
Но тут дело в другом. Надо радиус перевести в локальное пространство модели и пересчитать фаллофф заново. Это всё усложняет, теряется смысл.
Надо вспомнить, почему свет считается именно в локальном пространстве, для начала. Потому что изначально в P2 он считался в мировом, а тут я его переделал на локальное. Вот надо вспомнить почему.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 22-12-2021 в 07:41:
Цитата:
Дядя Миша писал:
Вот надо вспомнить почему
Ты же вроде сам сказал, что это было сделано для экономии юниформов?__________________
Мой мод на Xash
Отправлено Дядя Миша 22-12-2021 в 07:45:
Нет, надо вспомнить, почему свет именно в локальном пространстве.
На кол-во юниформов это никак не влияет. Возможно это как-то связано с хромом.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 22-12-2021 в 15:48:
Сейчас кое-что понял насчет теней от динлайта. Т.к. проекция не учитывает angles, я пытался нарыть хоть что-то и обнаружил вот такую прямую зависимость (см. аттач). Со скейлом проблем нет, только angles.
Координаты проекции теней берутся из (-pl->projectionMatrix[2][2], pl->projectionMatrix[3][2]), я стал крутить ее и так и сяк, но нужного результата не получил. Как мне ее повернуть на angles модели? Или что-то еще сделать, чтобы она это учитывала?
Я пробовал делать так
C++ Source Code:
matrix4x4 OmniShadowMatrix = pl->projectionMatrix.ConcatTransforms( m_pModelInstance->m_protationmatrix ); |
pglUniform4fARB( RI->currentshader->u_ShadowParams, shadowWidth, shadowHeight, -OmniShadowMatrix[2][2], OmniShadowMatrix[3][2] ); |
Ну, ничего не вышло. Ну тут метод тыка честно сказать, пытался сделать по подобию... 
__________________
Мой мод на Xash
Отправлено Дядя Миша 22-12-2021 в 17:02:
Метод тыка можно использовать, когда у тебя 2-3 варианта. В остальных случаях надо понимать что ты делаешь.
Добавлено 22-12-2021 в 20:02:
Хотя. Вот я сейчас пытаюсь побороть лайт-лики от радиосити на всратой геометрии. Мне известна причина их появления, мне известен способ борьбы, он уже дал положительный результат, ну а толку? Сижу и всё равно тыкаю, смотрю как будет лучше.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 22-12-2021 в 17:30:
Ну вот я уже понял, что мне надо повернуть эту pl->projectionmatrix. Наверное. Пробую еще вариант. Уже полез читать про матрицы и вроде это то что нужно, но не работает. Есть какие-то идеи?
C++ Source Code:
OmniShadowMatrix.ConcatRotate( m_pCurrentEntity->curstate.angles.x, 1, 0, 0 ); |
OmniShadowMatrix.ConcatRotate( m_pCurrentEntity->curstate.angles.y, 0, 1, 0 ); |
OmniShadowMatrix.ConcatRotate( m_pCurrentEntity->curstate.angles.z, 0, 0, 1 ); |
Чуть переделал, вроде так правильно. Но без изменений...
C++ Source Code:
OmniShadowMatrix.ConcatRotate( -m_pCurrentEntity->curstate.angles.z, 1, 0, 0 ); |
OmniShadowMatrix.ConcatRotate( -m_pCurrentEntity->curstate.angles.x, 0, 1, 0 ); |
OmniShadowMatrix.ConcatRotate( -m_pCurrentEntity->curstate.angles.y, 0, 0, 1 ); |
__________________
Мой мод на Xash
Отправлено Ku2zoff 22-12-2021 в 18:52:
Цитата:
Aynekko писал:
Уже полез читать про матрицы
Что в эту матрицу пишется? И сколько элементов в массиве? Тема матриц чисто математически не такая уж и сложная, мне сложнее дались пределы и дифференцирование функций. Но, чтобы знать, какие операции и как можно проводить с матрицами, для начала желательно научиться считать детерминанты. И поупражняться на бумаге в транспонировании, расчёте обратных матриц и разных преобразованиях. Можно конечно ничего не учить, а просто нагуглить необходимые операции.
Отправлено Aynekko 22-12-2021 в 19:14:
Цитата:
Ku2zoff писал:
Что в эту матрицу пишется? И сколько элементов в массиве?
C++ Source Code:
pl->projectionMatrix.CreateProjection( 90.0f, 90.0f, Z_NEAR_LIGHT, pl->radius ); |
Тут fov x, fov y, ближняя и дальняя дистанции. Проблема еще в том, что я пока не до конца уверен, на правильном ли я пути вообще. Но факт в том, что данные из этой матрицы засылаются в шейдер для проецирования теней на модель. Я сделал копию этой матрицы (matrix4x4 OmniShadowMatrix = pl->projectionMatrix) и теперь пытаюсь ее как-то изменить, чтобы заслать в шейдер. Но все без толку пока.
Вот еще скрин прикрепил. У моделей за спиной у нпс angles 0 0 0 и разный скейл. Все идеально. А по бокам дичь…потому что angles нестандартный. Хрен пойми как ее повернуть.
Добавлено 22-12-2021 в 22:14:
Цитата:
Ku2zoff писал:
Можно конечно ничего не учить, а просто нагуглить необходимые операции.
Хех, да было дело в далеком в 2009 году, когда я учился этому и даже что-то соображал. Уже забыл абсолютно все, за ненадобностью. Кто ж знал, что это сейчас пригодится. Я и в кодинг не лез никогда до прошлого года-то.__________________
Мой мод на Xash
Отправлено ncuxonaT 22-12-2021 в 20:12:
Дядя Миша

Aynekko переводи всё в мировое пространство, с локальным ты задолбаешься.