понедельник, 14 июня 2010 г.

4D Lookup Table

Вот уже довольно много времени прошло, как я вернулся к теме мягких теней. И хотя пространный пост о тенях будет позже, опишу, что я сделал из последнего.

Как-то по работе пришла мысль запечь одну непортируемую функцию в lookup table, но тогда ничего из этого не получилось, т. к. кол-во параметров и объём данных грозили превратить таблицу в гигабайтного монстра. Зато появилась идея реализовать lookup table для быстрого расчёта coverage источника света силуэтным ребром. Это функция от четырёх параметров - (x1,y1) и (x2,y2). Идеально подошла бы 4D-текстура или массив 3D-текстур, но железо не поддерживает ни один из этих вариантов. Выход прост - закодировать четырёхмерную таблицу в 2D-текстуре.

Вот как выглядит вариант такой 4D-таблицы для прямоугольного источника света:


Хотя набросать черновой вариант расчёта оказалось достаточно просто, выяснилось, что очень сложно добиться numerical stability для граничных случаев. И хотя мне удалось минимизировать эту проблему, она всё же кое-где даёт о себе знать:


Доработал вариант 4D-таблицы для сферического источника света. Выглядит она вот так:


Особенность расчёта этой таблицы в том, что отсутствуют проблемы с numerical stability, т. к. расчёты для диска проще. Подготовка таблицы помогла мне выявить потенциальные баги в математике, которых, как я считал, нет. У меня было два варианта расчёта coverage диска: один - точный, другой - ускоренный, с меньшим кол-вом мат. операций. Оба варианта почти всегда давали идентичный результат в test case, который я подготовил, при этом сам тест предполагал самые различные ориентации ребра. Как выяснилось, некоторые симметричные варианты расположения вершин всё же дают неправильный coverage в "быстром" варианте расчёта, поэтому он не годится. В принципе это уже не имеет значения, т. к. таблица как раз и призвана заменить эти расчёты выборкой.

Надеюсь, эти варианты таблиц можно будет использовать для первоначального ускорения алгоритма мягких теней. Что же быстрее - выборка или математические операции в шейдере? Дело в том, что мат. операции сами опираются на дополнительные выборки из кубической текстуры (2 выборки) и 2D-текcтуры (одна выборка), т. ч. в любом случае получается экономия.

четверг, 10 июня 2010 г.

Mesh Thickness

Экспериментирую с OIT и A-буфером. Вчера реализовал подсчёт толщины замкнутого меша с точки зрения камеры и затухание по экспоненте (аналогично демке в NV SDK 10).


Т. к. под reference rasterizer сложные модели уже не отладить, пока использую stencil routed K-buffer. Красным цветом помечены области, где overdraw > 4 (максимальный MSAA, который поддерживает HD 4330). Нужно сделать вывод в два K-буфера, чтобы аккумулировать хотя бы 8 слоёв и иметь картинку без "пробелов". Финальный вариант демки будет работать через A-buffer.

вторник, 8 июня 2010 г.

printf() в шейдере

Вышел новый DirectX SDK (June 2010). В шейдерах появились новые функции:

printf, errorf, abort.

Приехали :)

D3D10: отличия в реализациях run-time

Вчера наткнулся на любопытный баг, связанный с некорректной реализацией ранних версий рантайма Direct3D 10.0. Я использовал код двухлетней давности, в котором создавал multisampled depth/stencil буфер с флагами D3D10_BIND_DEPTH_STENCIL | D3D10_BIND_SHADER_RESOURCE. Последний флаг был необязателен, т. к. ресурс служил только как render target. Тогда код работал замечательно, но теперь при попытке реюзать его под feature level 10.0 рантайм выдал в debug output такое сообщение:

D3D10: ERROR: ID3D10Device::CreateTexture2D: If the device interface is D3D10.0 or the driver/hardware are D3D10.0 (regardless of API version), a Texture2D with sample count > 1 cannot have both D3D10_BIND_DEPTH_STENCIL and D3D10_BIND_SHADER_RESOURCE. This call may appear to incorrectly return success on older/current D3D10 runtimes due to missing validation, despite this debug layer message. [ STATE_CREATION ERROR #99: CREATETEXTURE2D_INVALIDBINDFLAGS ]

Это значит, что старые Direct3D 10 программы могут накрыться с новым ран-таймом (Windows 7). Реально это, конечно, ошибка, т. к. multisampled D/S не может читаться в feature level 10.0 (только multisampled RT и non-multisampled D/S). С другой стороны, D3D10_BIND_SHADER_RESOURCE почти всегда используется совместно с D3D10_BIND_RENDER_TARGET, поэтому неудивительно, что он случайно остался в флагах после копи-паста.

И в Microsoft для D/S этот флаг прозевали.
И старый код теперь некорректный.

P.S. В feature level 10.1 можно читать из multisampled D/S.

четверг, 27 мая 2010 г.

Год первый

У блога сегодня день рождения - ему исполнился один год.

За это время я написал о разных вещах: некоторые из них закончены, какие-то не удалось довести до конца (думаю, я ещё вернуть к ним). К сожалению, следующий год вряд ли будет таким же плодотворным, т. к. большую часть моего времени стала занимать работа, а в оставшееся хочется отдохнуть/отвлечься, т. к. это в принципе замкнутый круг и нужно уметь восстанавливать силы.

Но я не собираюсь бросать свои начинания, и обещаю, что в блоге появится ещё немало интересных описаний, демок и скриншотов.

вторник, 25 мая 2010 г.

3D Mark 11

3DMark 11 "Deep Sea" Tech Demo
Весьма примечательное видео.

пятница, 21 мая 2010 г.

First Self-Replicating Synthetic Bacterial Cell

Интернет будоражит от нового открытия: впервые создана синтетическая клетка с искусственно собранной ДНК!

За основу была взята структура генома бактерии Mycoplasma mycoides. В нее добавили дополнительные последовательности ДНК, таким образом отметив искусственное происхождение генома.

BBC: Первая искусственная форма жизни
Membrana.ru : Впервые создана искусственная форма жизни

Страница проекта: jcvi