вторник, 27 апреля 2010 г.

OIT and GI using DX11 linked lists

На developer.amd.com выложены слайды с GDC 2010, их можно найти на странице GPU Technical Publications. Одна из презентаций посвящена реализации OIT (думается, в Mecha Demo) от Nick Thibieroz и Holger Grün. Краткое описание алгоритма OIT можно прочитать в блоге Вольфганга Енджела - Order-Independent Transparency II. Кроме того, доступна русскоязычная статья на uraldev-е от Евгения Коростелева: Порядко-независимая прозрачность на GPU с использованием динамических списков.

Ранее я уже пробовал разобраться в шейдерах Mecha. Для этого пришлось написать hook-DLL для перехвата вызовов D3DCompileShader(). К сожалению, все шейдеры в демо зашиты в binary blob-ы, и всё, что можно сделать - это получить дизассемблированный код. Разобраться быстро в нём оказалось непросто, т. к. код по работе с OIT был густо перемешан с кодом расчёта освещения, сортировки и т. д. Тогда я отставил эту трудоёмкую задачу, и вот теперь стали доступны детали реализации.

OIT от AMD не использует prefix scan для расчёта смещений для записи фрагментов, как это описано в патенте Microsoft. Вместо этого используется R/W structured буфер, в элементах которого хранятся атрибуты фрагмента (цвет, глубина), и индекс предыдущего (следующего, как посмотреть) фрагмента в списке (если на пиксель экрана накладываются два и более фрагментов). Индекс указывает на элемент в structured buffer. Таким образом, полупрозрачные фрагменты организуются в памяти GPU в linked lists.

Преимущество этого метода в том, что запись в structured буфер всегда происходит последовательно, даже если фрагменты в буфер кадра приходят хаотически. В противовес этому, подход, применённый в DirectX SDK (и у меня), приводит к весьма хаотичному заполнению A-буфера. Для примера, стартовые позиции двух fragment bins для двух соседних пикселей уже различны. Добавьте к этому, что растеризатор выплёвывает фрагменты не линейно, а квадами 2х2, и получается безрадостная картина неупорядоченной записи в UAV (нужно отметить, что по моим тестам, при увеличении разрешения основной bottleneck заключался именно в заполении A-буфера, за ним следовала сортировка, и только потом - относительно дешёвый prefix scan). Поэтому на практике метод AMD на шаге аккумуляции фрагментов должен работать быстрее. Правда, в дополнение также используется т. н. Start Offset Buffer, но его элементы, в которые просходит запись, находятся в тех же позициях, что и фрагменты в буфере кадра.

На этапе сортировки фрагментов происходит traversal по этим linked lists, данные из различных участков памяти собираются в массив и сортируются. Теоретически такой traversal мог бы быть медленнее, чем линейная выборка fragment bins из A-буфера, но здесь мы можем просто читать из UAV, присоединив его как shader resource view. Т. к. random access текстур в GPU хорошо оптимизирован, этот шаг, вероятно, выполняется с хорошей скоростью.

P.S. Жаль только, что не могу реализовать алгоритм - Direct3D 11 железа больше нет под рукой :(
P.P.S. Хотя можно попробовать хотя бы с софтверной эмуляцией :)

среда, 21 апреля 2010 г.

Уе

Нео: Так это и есть...
Сайфер: Что, Unreal Engine? Да.
Нео: Ты всегда смотришь на него в таком виде?
Сайфер: Приходится. У разрабов нет никакого понятия, как писать на плюсах читаемый код. Но здесь уже ничего не поделаешь, видишь, сколько всего они навалили. Ты привыкнешь к нему. Я... я даже не вижу копрокода. Я вижу только блондинку, брюнетку, рыженькую... Эй, хочешь выпить?
Нео: Ещё бы.

суббота, 17 апреля 2010 г.

X-Slim X600

- But sir, NVidia said Fermi would be 60 percent faster than Cypress.
- 60 PERCENT MY FUCKING ASS!!!

Т. к. теперь у меня нет собственного компьютера, а без него, как вы понимаете, жить ну никак нельзя, пришлось приобретать ноутбук. Я уже писал в прошлом году, что присматриваюсь к ноутам, но тогда так и не довелось что-то купить. MSI нужных мне моделей ещё не появились у нас в официальной продаже, а остальное было либо слишком дорого, либо слишком топорно.

Мне нужен был язящный, легкий и тонкий ноутбук, плюс он должен был содержать дискретную видеокарту, поддерживающую минимум DirectX 10 (для программирования графики, иначе на кой хрен мне вообще нужен ноут?). Комбинация весьма своеобразная, но к счастью, оказалось, что ноутбуки MSI серии X-Slim X600 удовлетворяют всем этим требованиям.

И вот наконец-то я её приобрёл. Мне очень хотелось бело-серебристую модель, т. к. она выглядит весьма эффектно. Но как выяснилось, в Гондурас поставляются только чёрные, а серебристые можно купить, например, в США :(

Вот фотки ноута (качество не очень получилось, но всё же):


Я взял вариант с процессором Intel Celeron ULV, т. к. не хочется переплачивать за Core Solo - я не планирую использовать эту машинку в играх или тяжёлых приложениях, к тому же, надеюсь, это не последний ноутбук, который я приобретаю, а устаревают они очень быстро. Видеокарта - дискретная ATI Radeon HD 4330. Cоответственно, у меня теперь есть доступ к Direct3D 10.1 (я уже прогнал её через DirectX SDK, скорость в общем приличная, жаль только MSAA до 4x). Кстати, она начинает довольно сильно шуметь, когда увеличивается нагрузка на графический чип, но тут уж ничего не поделаешь.

И напоследок о весе. Вес - ~2.1 кг, что намного меньше, чем у среднестатистического "чемоданчика" (~3 кг). Достигнуто это тем, что убран привод DVD-дисков (зато в комплекте идёт флешка на 4 GB). И всё же даже 2 кг по моим ощущениям это многовато для стильной портативной машинки, оптимально, как мне кажется, 1.5 кг (MacBook Air - 1.36 кг)

P.S. А недавно узнал, что MSI готовится выпустить новую модель X400 с дискретной видеокартой, поддерживающей DirectX 11.