Comments 16
Поэтому если у нас буфер цвета и нормалей имеют формат RGB8, то и буфер глубины придется делать того же формата, а значения упаковывать (разделять) по трем компонентам.
Не совсем верное утверждение. Необходимо условие: «одинаковая разрядность» всех RT в MRT. К примеру: RGBA8 — 32 бита на пиксель и Single — float-формат, один канал: 32 бита.
Можно попробовать оптимизировать размытие используя субпиксельную выборку.
Вообще, при размытии SSAO-буффера необходимо учитывать глубину неоднородностей, просто так размывать нельзя.
Может стоит в самом начале указать, что у Вас версия Note 3 с mali
Круто! Хорошая картинка!
Математика (особенно в шейдерах) всегда пригодится
Математика (особенно в шейдерах) всегда пригодится
Здорово.
А под какой лицензией Вы опубликовали это? Как Вы относитесь к Creative Commons?
А под какой лицензией Вы опубликовали это? Как Вы относитесь к Creative Commons?
На Nexus 4 (Adreno 320, 1280x720) выглядит жутковато:
dl.dropbox.com/u/12721305/Screenshots/Screenshot_2014-04-09-20-37-29.png
Размытие ситуацию мало изменило
dl.dropbox.com/u/12721305/Screenshots/Screenshot_2014-04-09-20-37-29.png
Размытие ситуацию мало изменило
Отличная статья! Позвольте немного критики:
Вот уж сэкономили…
1) Заслуженно получили артефакты (не только в SSAO, а во всей геометрии, особенно ближней к камере).
2) Лишились Early-Z при рисовании всей геометрии(!). В Вашей сцене перерисовки пикселов почти нет, так что это не сказывается, но в общем случае — это катастрофа.
Да и сам способ вычисления линейной глубины вызывает сомнения:
Что по-Вашему есть «p.z»? Несомненно, это z-координата, но в каком пространстве? В проективном… а Вам нужно линейное. Правильно было бы так:
Отдельно стоит сказать про z-буфер. Для использования в SSAO его нужно сначала сделать линейным, в противном случае на среднем и дальнем плане сильно теряется точность. Обычно для этого значения глубины пишут в отдельный буфер, часто вместе с нормалями. Однако дополнительный буфер не сулит ничего хорошего в плане производительности, поэтому линеаризовывать значения и записывать их мы будем не в отдельный буфер, а прямо в действующий, стандартный буфер глубины (gl_FragDepth). Это может вызвать артефакты на переднем плане (очень близком, практически вблизи передней плоскости отсечения), однако в основном такой буфер ведет себя вполне нормально.
Вот уж сэкономили…
1) Заслуженно получили артефакты (не только в SSAO, а во всей геометрии, особенно ближней к камере).
2) Лишились Early-Z при рисовании всей геометрии(!). В Вашей сцене перерисовки пикселов почти нет, так что это не сказывается, но в общем случае — это катастрофа.
Да и сам способ вычисления линейной глубины вызывает сомнения:
vec4 p = matrixProj*matrixView*vec4(vPos, 1.0);
gl_Position = p;
zPos = p.z;
Что по-Вашему есть «p.z»? Несомненно, это z-координата, но в каком пространстве? В проективном… а Вам нужно линейное. Правильно было бы так:
vec4 p = matrixView*vec4(vPos, 1.0);
zPos = p.z;
gl_Position = matrixProj*p;
Никогда не понимал смысла SSAO, выглядит ведь совсем не натурально: вместо теней получаются какие-то страшные черные контуры вокруг предметов. Рекомендую к прочтению: nothings.org/gamedev/ssao/
Sign up to leave a comment.
SSAO на OpenGL ES 3.0