суббота, 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?

пятница, 4 сентября 2009 г.

How antialiasing works. Part 1.

Недавно я осознал, что мои познания в области антиалиаcинга на современных GPU - весьма посредственные. Учитывая, что появляются новые его разновидности, а также то, что теперь можно делать deferred rendering и HDR rendering с включенными антиалиасингом, необходимо разобраться в предмете более подробно. Т. к. тема обширная, разбираться буду постепенно и разобью обзор на несколько частей.

Для начала: cуществует несколько видов антиалиасинга. Простейший из них - это суперсэмплинг (аббревиатура SSAA или FSAA - Full-Scene Anti-Aliasing). Такой вариант антиалиасинга поддерживался, например, в NV10. Суперсэмплинг не требует специальной аппаратной поддержки и реализуется очень просто: сцена рисуется в буфер бОльшего разрешения, а потом сжимается с фильтрацией в меньшее разрешение. Фильтрация осуществляется путём простого усреднения цветов соседних пикселей. Например, если ваше конечное разрешение - 1024х768, то при 4x суперсэмплинге FSAA буфер должен иметь разрешение 2048х1536. Понятно, что этот способ очень сильно нагружает филлрейт - производительность падает примерно пропорционально увеличению разрешения, т. к. расчёт цвета и выборка из текстуры делается для каждого субпикселя. Такое падение производительности происходило на упомянутом GeForce 2. Впрочем, у этого метода есть одно преимущество - он способен сглаживать изображение, которое не было нарисовано с помощью треугольников (а, например, рассчитано в фрагментном шейдере).

Другой, более продвинутый вариант антиалисинга - это мультисэмплинг (MSAA - Multi-Sample Anti-Aliasing). Если копнуть в прошлое, то можно найти расширение OpenGL GL_SGIS_multisample от 1994 года - уже тогда на рабочих станциях SGI была его разновидность. На consumer hardware мультисэмплинг появился впервые, видимо, на видеокартах 3dfx (серия Voodoo 5), для этих видеокарт существовало ограниченное расширение GL_3DFX_multisample. NVIDIA впервые реализовала поддержку этого вида антиалиасинга в NV20 (GeForce 3). С тех пор MSAA с теми или иными вариациями реализуется на всех поколениях графического железа.

При мультисэмплинге фрагмент изображения перестаёт быть своего рода "атомом" (др.-греч. ἄτομος — неделимый). У него появляется внутренняя, невидимая до поры до времени структура - отдельные сэмплы (отсчёты). Говоря образно, у фрагмента появляется своё собственное разрешение (пусть и небольшое), и он способен "видеть" растеризуемые примитивы более подробно. Типичное кол-во сэмплов, которые определяют уровень антиалиасинга - 2, 4, 6 и 8.

Теперь разберём техническую сторону вопроса более подробно (я черпал информацию в основном из расширения GL_ARB_multisample и сверял с другими источниками).

Если формат пикселя кадрового буфера поддерживает мультисэмплинг, то к кадровому буферу добавляется специальный буфер отсчётов (multisample buffer). Такие значения сэмплов фрагмента, как цвет, глубина и значение трафарета сохраняются в этом буфере. Также с каждым фрагментом изображения связывается так называемое значение охвата (coverage value), кол-во бит в котором равно кол-ву сэмплов на фрагмент. Т. е. для каждого сэмпла отводится один бит из значения охвата. Эти дополнительные данные нужны для того, чтобы понять, какая площадь фрагмента перекрывается треугольником.

Сэмплы фрагмента могут располагаться как в пределах его границ, так и за его пределами. Более того, от пикселя к пикселю и от кадра к кадру их положения относительно центра фрагмента могут варьироваться - это зависит от деталей аппаратной реализации. К этому вопросу я вернусь позже.

Если в процессе растеризации сэмпл (как идеальная точка) попадает внутрь растеризуемого примитива или оказывается на его границе, то бит в значении охвата для этого сэмпла устанавливается в 1, иначе в 0. Тесты глубины и трафарета, а также смешивание (blending) цветов выполняются на уровне отдельных сэмплов, а не на уровне фрагмента. Кроме того, они выполняются только для тех сэмплов, для которых бит в значении охвата установлен в 1, иначе все операции для этого сэмпла пропускаются. Если тест трафарета или тест глубины проваливается, прекращается дальнейшая обработка только данного сэмпла, а не всего фрагмента. Фрагментный шейдер (или простая выборка из текстуры в случае FFP на NV20/25) всегда выполяется на уровне фрагмента, и все сэмплы получают одинаковое значение цвета, но значение глубины генерируется растеризатором для каждого сэмпла отдельно. (TODO: неясно, что происходит со значением глубины, если оно модифицируется в шейдере?). Согласно спецификации, значение трафарета генерируется для всего фрагмента, а не для каждого сэмпла отдельно:
The single fragment color value is used for all sample operations, however, as is the current stencil value.

После того, как все операции в буфере отсчётов завершены, цвета отдельных сэмплов фрагмента усредняются и результат записывается в буфер кадра. Метод усреднения зависит от конкретной реализации и уровня мультисэмплинга. В спецификации рекомендуется простое усреднение, рассчитанное независимо для каждого компонента цвета.

Как видно, основным преимуществом MSAA метода перед FSAA является меньшее кол-во текстурных выборок и вызовов фрагментного шейдера, хотя требования к памяти и framebuffer bandwidth остаются неизменными. Здесь появляется некоторая свобода, т. к. одно и тоже значение цвета для нескольких сэмплов позволяет задействовать цветовую компрессию:
If the color samples in the multisample buffer store fewer bits than are stored in the color buffers (...) presumably a compression scheme is being employed, and is expected to maintain an aggregate resolution equal to that of the color buffers.

Недостатком метода является сглаживание только вдоль рёбер треугольников, т. к. только там значения охвата могут отличаться от 1. Внутри треугольников изображение не сглаживается. Обычно это совсем незаметно из-за текстурной фильтрации, но если используется текстура с альфа-тестом, появляется сильный алиасинг.

понедельник, 31 августа 2009 г.

Диагноз

Любі друзі !

З відповідальністю повідомляю вам, що в Украіні не буде голоду в звязку з кризою, буде невеличкий піст, я би навіть сказав ПІСТЕЦЬ!

З повагою, щиро ваш, В. Ющенко!

NVIDIA OptiX

Решил из любопытства скачать примеры на движке OptiX (NVIDIA® OptiX™), благо они стали доступны. Фигушки! Все демки пишут "A supported NVIDIA Quadro FX GPU cannot be found". Хотя в на homepage в system requirements написано:
GPU: NVIDIA Quadro FX, GT200 or later; FX 3800 or better recommended
:(

четверг, 27 августа 2009 г.

Hydra oligactis

Продолжая иногда втыкать в азы геронтологии, я заинтересовался продолжительностью жизни различных животных. Поздравляю - человек является одним из наиболее долгоживущих видов на планете. С другой стороны, этого (120 лет в лучшем случае) явно мало.

До недавнего времени я думал, что всё на земле смертно (бактерии и всякие семена в расчёт не берём). Но как оказалось, это не так.

На земле существует, по крайней мере, один практически бессмертный организм - это гидра (Hydra Оligactis), которая относится к роду пресноводных сидячих кишечнополостных. Далее цитата из википедии:

Ещё в конце XIX века была выдвинута гипотеза о теоретическом бессмертии гидры, которую пытались научно доказать или опровергнуть на протяжении всего XX века. В исследовании, опубликованном в 1998 году, было показано, что по внешним, цитологическим признакам и способности к размножению, гидра не проявляет признаков старения на протяжении всего исследования в течение 4 лет. Даже если она, в принципе, и может стареть, разница между продолжительностью жизни и временем достижения половой зрелости, который составляет лишь около недели, весьма существенна.



понедельник, 17 августа 2009 г.

Девятый округ

Я в восторге.

Революционные технологии компьютерной графики, наложенные на документалистику и мусорную свалку.

Начался фильм с какого-то гонива над пришельцами, а закончился настоящей драмой.
9/10. Идти однозначно.

PS. Не понравились постоянные тряски камеры.
PPS. Кстати вот узнал, что подобный стиль съёмок называется мокьюментари (мockumentary). Буквальный перевод – «поддельная документалка».

суббота, 15 августа 2009 г.

Чудовище

Пожалуй, это лучший фантастический рассказ из тех, что я когда-либо читал. Он поражает и заставляет думать, думать и думать.

Когда я только в первый раз читал его, у меня сложилось мнение, что именно уродливые пришельцы - суть есть чудовища. Собственно, они ими и были, это становится ясно после описания процесса захвата чужих планет и геноцида целых рас (галактический фашизм). Звездолёт, лучевые ружья, защитное поле, Воскреситель - моральные уроды прекрасно оснащены в техническом плане и уже чувствуют себя хозяевами ещё чужого для них мира. Не мешкая, чудовища воскрешают обитателей новой планеты, одного за другим - им нужны ответы на их вопросы. Наученные кое-чему в процессе "колонизации" других планет, они копают сначала из глубокого прошлого, чтобы обезопасить эксперименты - чужие расы неведомы и загадочны... После очередного такого воскрешения они всё-таки обжигаются и приходится задействовать атомную бомбу. Тут бы казалось и экспериментам конец, но пришельцев мучает жгучее любопытство, что же всё-таки погубило планету - так трудно устоять перед искушением быстро узнать ответ! Эти твари решаются на ещё одно воскрешение - и подписывают свой смертный приговор. Очередной воскрешённый оказывается представителем пика эволюции человечества на древней Земле, владеющим умственным контролем над внутриядерными процессами, и по сравнению с ним пришельцы - как малые дети с кучей игрушек...

У человечества будущего, конечно, были и слабые места - не найдя способа определения звёзд с планетами, на которых ютится жизнь, они отказались от космоса и машин, сделав Землю своим вечным и единственным домом. Cтав практически бессмертными, они не научились воскрешать умерших... Всеми этими секретами владели пришельцы, а после воскрешения обо всём этом немедленно узнал и Человек. Упрекая себя за близорукость в отношении некоторых вопросов ("мы больше никогда не попадемся так глупо, как в тот раз"), он хочет договориться с пришельцами полюбовно (в благодарность за своё воскрешение), но ограниченные в своём кругозоре и понимании ситуации рогатые гости нежелают принимать его доводы и продолжают гнуть своё. Поняв, что уничтожить двуногое "чудовище" они не смогут, они отправляются в полёт за помощью. Но в полёте, понимая, что они безнадёжно проиграли в этом противостоянии, принимают последнее возможное решение - уничтожить себя и звездолёт, направив его на звезду.

По этому рассказу можно было бы снять великолепный фантастический фильм. И если этим никто не займётся...