Deferred Shading, AA, alpha blending. (demo, DX10)

Jan 13, 2009 17:09

Играл в GTA4, и не мог не заметить повсеместного использования функции Alpha To Coverage. В последнее время её использовали для создания AA на треугольниках с альфа-тестом1, но в игре никакого сглаживания нету, а фича используется для «плавного» возникновения объектов.

И тут в голову пришла идея сделать deferred shading c полупрозрачными поверхностями и полноэкранным сглаживанием без разложения по слоям, как например в depth peeling2.
Для реализации нужно уметь получать значения отдельных семплов multisampled буфера, поэтому, вооружившись DX help и туториалами 01, 02 начал писать демку под DX10.

Первоначальная идея заключалось в том, что заполняя G-buffer, для полупрозрачных поверхностей будем задавать маску (SampleMask) с количеством активных семплов таким, чтобы оно по отношению к общему количеству было приблизительно равно значению прозрачности (для ААх8 возможны 8 значений прозрачности). Сразу возникли проблемы с прозрачными элементами в несколько слоёв. Пришлось руками задавать разные маски семплов. И следить за качеством результата.

В шейдере освещения для каждого семпла считается двустороннее диффузное освещение, блики и добавляется упрощённое объёмное освещение3. Вес каждого семпла - 1/количество. Понял, что можно присваивать каждому семплу разные веса, а именно - рисовать полупрозрачный объект только в один семпл при заполнении G-buffer’а и по особой формуле преобразовывать прозрачность в весовой коэффициент. Проблему order-independent transparency это не решило, но теперь полупрозрачная поверхность могла занять выделенное ей место. Ну и прозрачность больше не ограничена 8 значениями.
В результате, владельцам видеокарт с поддержкой DX10 и установленной Vista\Win7 предоставляется демка с исходниками:
Архив, 335кб

Кадры:









Демка just for fun и на серьёзный метод не претендует. Памяти на G-buffer огромное количество, нагрузка на GPU отгромная.
Проверена на HD 2600 (20fps) и HD 4850 (100fps), NV не удалось достать.
Если производительности хватает, в шейдере LightPS можно поставить до 32 источников света.

1 http://developer.download.nvidia.com/SDK/9.5/Samples/samples.html#AntiAliasingWithTransparency
2 http://developer.download.nvidia.com/SDK/10.5/direct3d/samples.html#StencilRoutedKBuffer
3 http://humus.name/index.php?page=Comments&ID=44&start=16
Previous post Next post
Up