Дядя Миша писал: Вещественное с плавающей точкой хранит не значение, а выражение, грубо говоря. Ну чтобы тебе было понятнее, 4 * 12 = 48 и 6 * 8 = 48.
Согласно стандарту, одно и то же число всегда будет записано одинаково.
"Некоторые числа могут иметь несколько представлений в формате, в котором они были только что описаны. Например, если b = 10 и р = 7, то число −12,345 может быть представлено как: −12345 × 10−3, −123450 × 10−4 или −1234500 × 10−5.
Для десятичных форматов любое представление справедливо, и совокупность этих представлений называется когортами. Когда результат может иметь несколько представлений, стандарт определяет, какой выбран членом когорты.
Для бинарных форматов представление делается уникальным путём выбора наименьшего представляемого показателя. Для чисел с показателем в нормальном диапазоне (не все из них или все нули), ведущий бит мантиссы всегда будет равен 1. Следовательно, ведущий 1 бит может подразумеваться, а не сохраняться явно в памяти. Это правило называется ведущей битной конвенцией или скрытой битной конвенцией. Правило позволяет сберечь 1 бит памяти, чтобы иметь ещё один бит точности. Ведущий бит конвенции не используется для субнормальных чисел; их показатель находится за пределами нормального диапазона значений. "
Дядя Миша писал: Это вероятно тот самый гейзенбаг, о котором так долго твердили большевики. Вылет в движке, как-то связан с логом.
Условия появления:
1. Только на P2
2. Только в режиме -dev (без -dev или в режиме -dev 2 не проявляется).
Возникает на самом начальном этапе инициализации.
Я так и не понял, что это такое, и откуда взялось, но это точно связано с ведением лога.
Поймал вылет на ванильной паранойе, запускал с параметрами -console -log +sv_cheats 1 -dev 7
code:
=================================================================================
Xash3D 0.99 (build 4511) started at Aug26 2021 [21:22.42]
=================================================================================
Console initialized.
Mem_Free: not allocated or double freed (free at D:\Xash3D\src_main\engine\common\filesystem.c:1261)
Зачем в шейдерах в texfetch.h в функции normalmap2D инвертируется Y-координата нормали?
Cg Pixel Shader:
N.y = -N.y; // !!!
N = normalize( N );
Добавлено 27-08-2021 в 21:37:
Цитата:
SNMetamorph писал: Зачем в шейдерах в texfetch.h в функции normalmap2D инвертируется Y-координата нормали?
Cg Pixel Shader:
N.y = -N.y; // !!!
N = normalize( N );
Ага. Без этой инверсии нормалка начинает выглядеть неправильно.
Также, параллакс маппинг не заработал нормально, пока я в viewDir векторе не инвертировал Y координату. Это уже получается какая-то проблема типа SQB, только с TBN в шейдерах. Получается, TBN как-то не совсем правильно строится?
Это еще с даркплейса тянется. Для паранои первую версию компиляторов делал китаец (Кастомный VHLT). Я предложил ему взять имплементацию делюкс-маппинга из Darkplaces. Просто, чтобы иметь возможность контролировать контент под сторонним движком (и кстати я этим активно пользовался на начальных этапах). А там тангента инвертирована почему-то была. Ну вот и пришлось так всё оставить.
SNMetamorph потому что в паранойе нормалмапы были вразнобой, половина в директикс спейсе, половина в опенгл спейсе.
Инвертирование было попыткой сделать так, чтобы большая часть нормалмап выглядела правильно.
Плюс у моделей неправильно строится TBN в случае отзеркаленной развертки.
Вроде я это исправил, в gl_studio_init.cpp строчки 1524 и далее:
C++ Source Code:
1
if( !smooth_tbn )
2
{
3
Vector tmpVect = CrossProduct( sVect, tVect );
4
bool leftHanded = DotProduct( tmpVect, normal ) < 0.0f;
5
6
if( !leftHanded )
7
{
8
tVect = CrossProduct( normal, sVect );
9
sVect = CrossProduct( tVect, normal );
10
}
11
else
12
{
13
tVect = CrossProduct( sVect, normal );
14
//sVect = CrossProduct( normal, tVect );
15
//nc fix?
16
sVect = CrossProduct( tVect, normal );
17
}
18
}
И для нормалмап в опенгл спейсе инвертирование игрека не нужно, если что.
ncuxonaT писал: SNMetamorph потому что в паранойе нормалмапы были вразнобой, половина в директикс спейсе, половина в опенгл спейсе.
Инвертирование было попыткой сделать так, чтобы большая часть нормалмап выглядела правильно.
Плюс у моделей неправильно строится TBN в случае отзеркаленной развертки.
Вроде я это исправил, в gl_studio_init.cpp строчки 1524 и далее:
C++ Source Code:
1
if( !smooth_tbn )
2
{
3
Vector tmpVect = CrossProduct( sVect, tVect );
4
bool leftHanded = DotProduct( tmpVect, normal ) < 0.0f;
5
6
if( !leftHanded )
7
{
8
tVect = CrossProduct( normal, sVect );
9
sVect = CrossProduct( tVect, normal );
10
}
11
else
12
{
13
tVect = CrossProduct( sVect, normal );
14
//sVect = CrossProduct( normal, tVect );
15
//nc fix?
16
sVect = CrossProduct( tVect, normal );
17
}
18
}
И для нормалмап в опенгл спейсе инвертирование игрека не нужно, если что.
Вроде понял, а вроде и нет. Ведь в случае с параллаксом я вообще нормалмапы не юзаю, а для корректного результата делать инвертирование все же приходится. Т.е. что-то не так с TBN внутри шейдера. Я думаю, нужно что-то в самом TBN поменять, чтоб не приходилось везде ставить инверсии.
Дядя Миша Элбер большую часть нормалмап генерировал сам из диффуза каким-то суперуродским способом, что всё покрывалось мерзким шумом. А из тех игр, откуда он брал, только в параграфе 78 нормали вразнобой, в остальных вроде бы всё прилично.
SNMetamorph на мировых полигонах TBN тоже как-то не так считается при отзеркаленной развертке, возможно, параллакс к этому чувствителен. Можешь сделать карту с двумя стенами, чтобы на одной текстура была слева направо, а на другой справа налево? Параллакс на обеих будет одинаково работать, или на одной чудить?
А как в П2 рендере сделано, что на картах которые собраны п2шным компилятором с включенным динамическим солнцем улица корректно затемняется полностью? А при этом то, что в помещении, и лампы, остаётся светлым? По идее же эмбиент должен вообще всё освещение на локации затрагивать, и должно темнеть все, кроме динлайтов.