понедельник, 22 марта 2010 г.

Подсчет ссылок в D3D8 и D3D9

Казалось бы что может быть сложного, на AddRef() увеличиваем кол-во ссылок, в Release() уменьшаем. Но в Diretct3D 8 и 9, как обычно, не все так просто и чтобы создать полноценный Direct3D Wrapper необходимо это все учитывать, иначе некоторые игры начнут с ни падать.

Вот некоторые особенности:
  • Автоматически созданные IDirect3DDevice9 ресурсы (BackBuffer, автоматически созданный depth-stencil surface, основной SwapChain) нельзя удалить, т.е. Release() можно вызывать хоть до бесконечности он будет возвращать кол-во ссылок 0 и не удалит ресурс.
  • Само устройство не увеличивает кол-во ссылок на автоматически созданные ресурсы.
  • Пока ресурс забинджен в устройство (с помощью SetTexture, SetRenderTarget или SetDepthStencilSurface) его нельзя удалить, при попытке удалить его счетчик ссылок не будет опускать ниже 0. После того устройство освободит ресурс если кол-во ссылок ресурса равно нулю он будет удален.
  • У текстуры и её поверхностей общий счетчик ссылок.
Вот так то :-)

воскресенье, 22 ноября 2009 г.

Переход с Direct3D9 на Direct3D9Ex

Была необходимость воспользоваться Shared ресурсами в D3D9 под Vist'ой/Win 7, для этого решили переписать приложение чтобы оно вместо интерфейса IDirect3DDevice9 стало использовать IDirect3DDevice9Ex. Казалось бы что может быть проще, у IDirect3DDevice9Ex родительский интерфейс IDirect3DDevice9.

Но как всегда всплыли некоторые подводные камни:

Под D3D9Ex не поддерживаются Pool Managed для ресурсов, поэтому пришлось их все перевести в Pool Default. Так как ресурсы в Pool Default можно лочить только установить Usage Dynamic, пришлось его установить у соответствующих ресурсов.

  • Так как для Managed ресурсов LockRect всегда возвращал Pitch равный ширине поверхности в байтах, т.е. строки не выравниваются, а строки в динамических ресурсах в Pool Default наоборот всегда выравниваются до следующего значения кратно степени двойки. Поэтому пришлось переписать места где текстуры заливались одним memcpy без учета Pitch, так чтобы они корректно работали с выравненными строками.
  • Выяснилось ещё для Volume текстур в Pool Default в LockBox есть баг в Direct3D9 и Direct3D9Ex, он напрочь игнорирует параметры Front, Back и всегда лочит весь объем полностью. Для Volume текстур в Pool Managed все работает правильно в Direct3D9. Переписали код чтоб обновляли содержимое объема всегда полностью.


Может кому будет интересен или даже полезен этот опыт.

пятница, 20 ноября 2009 г.

пятница, 21 августа 2009 г.

Упрощение отладки в Visual Studio - autoexp.dat



Собрал/написал самые полезные для меня визуализаторы: Boost (для самых популярных классов) и TinyXML. А также там добавлены коды ошибок Direct3D.

Для установки, следует заменить файл в "%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\" файлом из архива.

Ссылки по теме:
 

Update: для Visual Studio 2012 теперь можно установить extension со всеми визуализаторами перечисленными выше и даже больше http://bit.ly/Mn73hE

пятница, 26 июня 2009 г.

iZ3D монитор в России

Вот и приехали мониторы. Можно приобрести у нас в офисе или прямо на сайте http://shop.neurok.ru/ (сайт пока к сожалению в плане дизайна ещё не доделан). В комплекте 3-ое очков, если надо можно докупить в офисе еще какое то количество.

Цена: 555$.
Гарантия: 1 год.

пятница, 29 мая 2009 г.

iZ3D драйвер версии 1.10RC1

Вот наконец и выпустили 1.10 версию (скачать можно тут http://www.iz3d.com/t-dcdriver.aspx). С этой версией в ходе дебаггинга много поработали над артефактами играми, поняли причину многих проблем с играми в стерео и много из них исправили.

Чаще всего встречаются следующие проблемы (NVidia тоже упоминала об этом в своей презентация):

  1. Реконструкция координат в пиксельном шейдер по карте глубины. Обычно по этой причине в большинстве игр некорректно рисуются тени (например, Crysis, STALKER, UT3, GTA4 и т.п.). Пока нет идей как универсально исправить эту проблему для таких игр, но мы работаем над данной проблемой. Если в PS напрямую передается обратная матрица проецирования (Dead Space, пример NVidia Deffered Shading), то пока мы можем вручную решить данную проблему с помощью профайлов. Crysis к примеру вообще напрямую не использует в шейдере обратную матрицу проецирования, а делает более хитрые операции с константами. Возможно когда-нибудь наступит счастье и большинство разработчиков игр будут используемый предлогаемый NVidia способ, сохраняя Clip space X координату в RT и восстанавливая World space координату используя этот RT, тогда все эффекты будут нормально работать.
  2. Эффекты, надписи над объектами и т.п. рисуются без использования матрицы перспективной проекции. Например данный эффект можно пронаблюдать с источниками света в Mirror's Edge или в Dead Space которые рисуются в моно, а также к примеру в WoW надписи над объектами рисуются также в моно. Данную проблему мы не можем исправить, т.к. не знаем на какую глубину объект следует поместить.
  3. Моно объекты рисуются с использованием перспективной матрицы проецирования. Это обратная ситуация когда к примеру 2D интерфейс рисуется с использованием той же матрицы проецирования что и вся сцена. Чтобы сделать в таких случаях интерфейс моно мы указываем драйверу что используемый вертексный шейдер рисует всегда 2D интерфейс и драйвер использует эту информацию при рисование сцены. Бывает более сложная ситуация когда один и тот же шейдер используется и для 2D и для 3D объектов (UT3, GoW) но мы в большинстве случаев можем решить подобную проблему.
  4. Игра располагает объекты на неправильной глубине. В некоторых играх небо располагают слишком близко к сцене, что дает неправильный стереоэффект. А также, очень часто оружие персонажа располагают на большом расстояние от самой сцены и из за этого визуально нельзя добиться хорошей глубины сцены.


Вот пожалуй самые основные встречающиеся нам проблемы.

вторник, 5 мая 2009 г.