суббота, 5 сентября 2009 г.

How antialiasing works. Part 2.

Нетрудно догадаться, что качество сглаживания изображения методом мультисэмплинга зависит от кол-ва сэмплов на фрагмент. Максимальное их кол-во, которое аппаратно поддерживается на сегодня - 8. Хочется больше, но дальнейшее увеличение кол-ва сэмплов приводит к неоправданным расходам памяти а пропускной способности чипов. Возьмём типичное разрешение 1280x1024. Уровень 16xMSAA означает, что нам нужен буфер отсчётов размером 5120х4096. Если предположить, что под Z/stencil буфер отведено 32 бита, а буфер цвета имеет формат R16G16B16A16 (64 бита), то буфер отсчётов займёт 20 971 520 х 96 / 8 = 251 658 240 байт = 240 Мбайт видеопамяти. Это просто нереально, для любого потребительского железа.

Чтобы сдвинуть технологию мультисэмплинга с мёртвой точки, NVIDIA представила в G80 CSAA - Coverage Sampling Anti-Aliasing. Главной особенностью нового метода стало более точное определение, какую площадь фрагмента покрывают границы треугольника. Если MSAA отделил закрашиваемый фрагмент от отдельных сэмплов, экономя на вызове фрагментного шейдера и выборках из текстуры, то CSAA расширил его, отделив значение охвата от color/z/stencil значений в сэмпле. И если кол-во обычных сэмплов в CSAA осталось неизменным (4 или 8), то кол-во сэмплов охвата увеличилось до 8 или 16. А т. к. значение охвата представляет собой всего лишь битовую маску, требования к памяти и пропускной способности возрастают незначительно.



NVIDIA не вдаётся в детали реализации этой технологии, но можно попробовать представить себе, как примерно всё работает. Во-первых, буфер охвата тесно связан с z-буфером, т. к. значения глубины и охвата обновляются одновременно:
Try to avoid updating color and z independently, as CSAA coverage information is only updated when z is being written.
Для разработчиков NVIDIA приводит некоторые советы, как правильно осуществлять рендеринг при включенном CSAA - избегать разделения z-буфера между несколькими целями рендеринга без предварительной очистки, избегать частичной очистки z-буфера. Для правильной работы, сэмпл охвата должен знать, с какими сэмплами color/z/stencil он связан. Поэтому к одному coverage биту нужны ещё три, чтобы индексировать один из восьми сэмплов. После того, как в буфере отсчётов будет сформировано изображение, усреднение цветов сэмплов должно происходить так:
1) Читается coverage бит. Если он равен 0, сэмпл охвата пропускается.
2) Если от равен 1, читается цвет из color/z/stencil сэмпла, на который указывает сэмпл охвата.
Т. к. кол-во сэмплов охвата больше, чем обычных сэмплов, то их цвета выбираются и усредняются более точно, в зависимости от площади покрытия фрагмента треугольником.

Конечно, 8xCSAA уступает в качестве изображения 8xMSAA, как и 16xCSAA по сравнению с теоретическим 16xMSAA. Тем не менее, он требует лишь незначительного увеличения памяти для хранения сэмплов охвата и улучшает качество изображения по сравнению с обычным MSAA.

Coverage Sampling Antialiasing
What is CSAA?

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

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