Вот уже довольно много времени прошло, как я вернулся к теме мягких теней. И хотя пространный пост о тенях будет позже, опишу, что я сделал из последнего.
Как-то по работе пришла мысль запечь одну непортируемую функцию в 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туры (одна выборка), т. ч. в любом случае получается экономия.
понедельник, 14 июня 2010 г.
четверг, 10 июня 2010 г.
Mesh Thickness
Экспериментирую с OIT и A-буфером. Вчера реализовал подсчёт толщины замкнутого меша с точки зрения камеры и затухание по экспоненте (аналогично демке в NV SDK 10).
Т. к. под reference rasterizer сложные модели уже не отладить, пока использую stencil routed K-buffer. Красным цветом помечены области, где overdraw > 4 (максимальный MSAA, который поддерживает HD 4330). Нужно сделать вывод в два K-буфера, чтобы аккумулировать хотя бы 8 слоёв и иметь картинку без "пробелов". Финальный вариант демки будет работать через A-buffer.
Т. к. под 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.
Приехали :)
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 такое сообщение:
Это значит, что старые 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.
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 г.
пятница, 21 мая 2010 г.
First Self-Replicating Synthetic Bacterial Cell
Интернет будоражит от нового открытия: впервые создана синтетическая клетка с искусственно собранной ДНК!
За основу была взята структура генома бактерии Mycoplasma mycoides. В нее добавили дополнительные последовательности ДНК, таким образом отметив искусственное происхождение генома.
BBC: Первая искусственная форма жизни
Membrana.ru : Впервые создана искусственная форма жизни
Страница проекта: jcvi
За основу была взята структура генома бактерии Mycoplasma mycoides. В нее добавили дополнительные последовательности ДНК, таким образом отметив искусственное происхождение генома.
BBC: Первая искусственная форма жизни
Membrana.ru : Впервые создана искусственная форма жизни
Страница проекта: jcvi
Подписаться на:
Сообщения (Atom)


