COMMAND ENCODER (Barkar Ivan)
163 subscribers
168 photos
72 videos
17 files
108 links
Cool shading, nice ball moment
Download Telegram
засемлил сырую шадоумапу
на память:

When calculating texture coordinates to sample from shadow map, flip the y/t coordinate and convert from the [-1, 1] range of clip coordinates to [0, 1] range of
used for texture sampling


сделать можно или на cpu


let shadowScale = scaleMatrix(.init(0.5, -0.5, 1))
let shadowTranslate = translationMatrix(.init(0.5, 0.5, 0))
let shadowTransform = shadowTranslate * shadowScale

и умножить на MVP теней

или в шейдере править координаты тени

shadowCoord.xy = shadowCoord.xy * 0.5 + 0.5;
shadowTextureCoord.y = 1 - shadowTextureCoord.y;
Буффер с данными материала и текстуры отправлять на рендер шадоумапы не всегда имеет смысл.
Громоздкий вертекс дескриптор в DepthOnly тоже ни к чему
shadow * N dot L
беды с тангентом. вертекс дескрипторами. тангентом хз
да в попу ваш метол, доканал этот тангент
да ты ч.... блиааааа
😵 дебаг с устройства показал, что нормали в srgb
Please open Telegram to view this post
VIEW IN TELEGRAM
Репутация тангента восстановлена. Впредь, нормали из сабстанса выводим в RAW RGBAFloat, а не Linear
внимательнее следим за sRGB в нормалях из-за активности хейтеров
clayton_janie_metal_programming_guide_tutorial_and_reference.pdf
8.2 MB
Немного более серьезная книженция, заставляет задуматься
восстанавливаем z компонент единичного вектора по x и y,
таким способом, в одну текстуру можно уложить X и Y компоненты нормали, рафнесс и металлик маски, например.


half4 normRoughMetSample = NormRoughMetallic.sample(linearSampler, IN.texCoord);

half3 normalTS;
normalTS.xy = half2(normRoughMetSample.x, normRoughMetSample.y) * 2.0 - 1.0;
normalTS.z = sqrt(1 - (normalTS.x * normalTS.x) - (normalTS.y * normalTS.y));

half3x3 tantgenToWorld = half3x3(IN.tangentWS, IN.bitangentWS, IN.normalWS);
half3 normalWS = tantgenToWorld * normalTS;
normalWS = normalize(normalWS);
Отдельный Directional light render pass.
Не прошел мимо нормалей и накосячил снова
вариант не круить биас в шейдере для избавления от акне в тенях
renderEncoder.setDepthBias(0.005, slopeScale: 7, clamp: 0.02)
косяки после восстановления z уже у мировых нормалей. Вероятно, у рендер таргета придется забирать все 3 компонента
и распихивать рафнес и металлик по свободным альфа каналам

или проблема read вместо sample, но фильтрация тут лишняя