Прошлый вариант SSAO оказался не очень удачный - чтобы обходиться одним буфером глубины требуется ставить пару костылей, связанных с самозатенением поверхности. Возможно если еще поиграть с настройками, можно сделать что-то более менее вменяемое.
С другой стороны, раз сейчас всюду стали использовать G-Buffer и там обычно всегда есть нормали, то можно их использовать и для SSAO.
Поэтому я добавил G-Buffer.
Пока использую обычные regular normals в world space, которые помещаются в A2R10G10B10, на самом деле для SSAO этого достаточно, но мне понравился способ упаковки best fit normals и думаю затем его сделать и использовать A8R8G8B8, где альфа уже будет свободна для чего-нибудь другого, тем более что в составе полноценного рендера нормали пригодятся для тех же бликов и отражений, где точность более критична.
Еще, как выше указал
Mr_F_, надо попробовать посчитать во view space и сравнить оба варианта.
Для глубины сейчас используется R32F.
На скрине видно ещё не сглаженный SSAO. Сейчас я переписал ранее написанные в RenderMonkey шейдеры в эффект и собрал приложение на котором можно будет это тестить.
На скрине видно что вокруг носа чайника чуть более светлый ореол. Видимо связано с тем, что формула, которая должна уменьшать эффект затенения с расстоянием, начинает его чрезмерно уменьшать в сторону увеличения яркости - тут нужно посмотреть какие есть варианты в реализациях SSAO из других источников.
Кстати, на скрине можно видеть 527 FPS, для 1080p вроде неплохо. Последующее сглаживание снизит этот показатель, но остаётся возможность оптимизации самого SSAO шейдера и G-Buffer'а, которые надеюсь смогут компенсировать потери на сглаживании.
Ну и ещё стоит упомянуть что от кодов Борескова тут практически ничего не осталось, если бы у меня не было некоторого опыта в шейдерах (а статья рассчитана на новичков), шейдер по статье невозможно было бы повторить.