UnityФорумПрограммирование

_CameraDepthNormalsTexture - как получить нормали?

#0
(Правка: 23:11) 22:54, 4 сен 2024

Привет всем!
Пишу эффект для PostProcessingStack.
Камера рендерит в Deferred.
Столкнулся с тем, что _CameraDepthNormalsTexture возвращает нормали, значения которых зависят от вращения камеры.
Например, если смотреть вперед, то результат будет таким:

+ Показать

А если опустить взгляд в область где должны быть видны ноги игрока, то результат будет таким:

+ Показать

Нормали вычисляются так:

+ Показать

В целом цвет нормалей пола +- зеленый, но нормали смотрят не вертикально вверх. Видно что цвет совсем немного темнее при взгяде на пол.

В PostProcessingStack есть дебагер:

+ Показать

Думал залезть в него и раскурочить с целью узнать как нормали они вычисляют.
Воспользовался им и заметил что он тоже дает кривые нормали. Точно такие как и у меня. Цвет меняется в зависимости от поворота камеры.

В чем причина? Как можно получить нормали без искажений?

#1
23:42, 4 сен 2024

Решение такое:

Скрипт:
sheet.properties.SetMatrix("_InverseView", context.camera.cameraToWorldMatrix);
Шейдер:
float4 cdn = SAMPLE_TEXTURE2D(_CameraDepthNormalsTexture, sampler_CameraDepthNormalsTexture, input.texcoord.xy);
wNorm = (DecodeViewNormalStereo(cdn).rgb);// * float3(1.0, 1.0, -1.0));
wNorm = mul((float3x3)_InverseView, wNorm); // <- world normal
UnityФорумПрограммирование