четверг, 15 октября 2009 г.

How antialiasing works. Part 4.

Ранее я писал про антиалиасинг на GPU:

Part 1
Part 2
Part 3

Но тема охвачена не полностью, ещё есть что изучать. По мере сил я и дальше буду выкладывать в блоге что-нибудь интересное по ней. Тогда я оставил невыясненным вопрос, что происходит, если фрагментный шейдер пишет в SV_Depth (gl_FragDepth в OpenGL, регистр oDepth в asm). У меня самого до сих пор не стояла задача изменять глубину вручную.

Если мы не пишем в depth из шейдера, то это значение рассчитывается fixed-function pipeline интерполяцией по треугольнику. В случае MSAA, каждый сэмпл фрагмента получает своё индивидуальное значение глубины, и тест глубины проводится отдельно для каждого сэмпла. Фрагментный шейдер исполняется для фрагмента только один раз, и одинаковые значения цвета записываются только в те сэмплы, который прошли индивидуальный depth test. Благодаря fine-grained depth test, в местах пересечения геометрии получается сглаженная лесенка:
Если шейдер пишет в SV_Depth, то посколько он исполняется только один раз, то и значение глубины (как и цвета) получается одинаковым для всех сэмплов. И хотя depth test продолжает выполняться на уровне сэмплов, отличия проявляются только на фрагментном уровне. Эффект сглаживания, конечно, пропадает:
Direct3D 10.1 вводит такую возможность как per-sample fragment shader evaluation, подобную функциональность предоставляет и расширение GL_ARB_sample_shading (если с расширением всё ясно, то в Direct3D пока не нашёл, как включать). Данная возможность может быть использована при рендеринге растительности с альфа-тестом. Вероятно, можно решить и приведённую выше проблему, т. к. теперь для каждого сэмпла можно записывать (или нет) depth, рассчитанный интерполятором до шейдера - но я не пробовал (железа под рукой нет :().

Комментариев нет:

Отправить комментарий