@AgainstAllAutority ну на деле я не программист, поэтому использую уже готовый шейдер с гитхаба, но уже сам реализовал GTSO по докам активижона и свои некоторые исправления в GTAO
насчет эвристики, тут дело не в толщине, а в методе 'отсечения'. в прошлом методе там использовалась линейная функция 'отсечения', после проводилась проверка с предыдущим значением.
я вот таким образом реализовал 'отсечение': h.x = (h.x > H.x) ? H.x : lerp(H.x, h.x, step(Heuristic, -dPds.z));
h.y = (h.y > H.y) ? H.y : lerp(H.y, h.y, step(Heuristic, -dPdt.z));
насчет бэнт нормалей, я тут уже с другого источника (не помню какого) взял вот такую реализацию: float Hangle = 0.5f * (h.x + h.y);
bentNormal += viewDir * cos(Hangle) - tangent * sin(Hangle);
и уже после цикла: bentNormal = normalize(normalize(bentNormal) - viewDir * 0.5f);
но если V = N, то смысла от этих бэнт нормалей нет
насчет Multibounce - тут использую аппроксимацию за счет коэффициентов кубического полинома, который написан в презентации активижона на стр 78
p.s. я бы покидал парочку скринов, но размер не позволяет, а сжимать и мусорить не очень хочется