d3d 11 обратно совместим с d3d10 и d3d9?

Я представил вопрос, который на самом деле представлял собой кучу вопросов в одном, поэтому я разбиваю их на отдельные вопросы, как и просили.

просто общий вопрос о Direct3D, если бы я написал приложение полностью на d3d11 с шейдерами hlsl 5.0, будут ли они по-прежнему совместимы только с системами, поддерживающими d3d10 или d3d9, только с менее приятными графическими эффектами и эффективностью d3d11? Если да, то насколько менее эффективным он будет? Если нет, нужно ли мне делать 2 или 3 разные версии одной и той же программы, за исключением использования d3d9, d3d10 и d3d11?


person FatalCatharsis    schedule 17.04.2012    source источник


Ответы (3)


Он обратно совместим в определенной степени. Однако есть несколько вещей, о которых следует помнить:

  • DX11 можно установить только на Vista+, что исключает тех, кто до сих пор сидит на XP по религиозным соображениям (лично я считаю это глупостью, но это просто факт, о котором нужно знать)
  • Убийственная функция DX11 (аппаратная тесселяция) доступна только на оборудовании, совместимом с DX11. Поверьте мне - вам будет очень трудно воздержаться от его использования из-за большого набора возможностей, которые он вам дает. Это можно несколько компенсировать с помощью геометрических шейдеров, но... см. следующий пункт.
  • Геометрические шейдеры доступны только на оборудовании класса DX10.0 (или выше). Так что HW класса DX9 не в счет... опять...
  • Вычислительные шейдеры частично доступны на оборудовании класса DX10.0+ (хотя и весьма ограничены), но совершенно недоступны для более раннего оборудования.

Подводя итог, можно сказать, что использование DX11 имеет смысл, если вашей целевой платформой является аппаратное обеспечение класса DX10.0+ (потому что помимо аппаратной тесселяции различия допустимы и/или существуют обходные пути для отсутствующих функций). Если вы хотите поддерживать DX9 HW, я бы посоветовал вам придерживаться DX9 SDK, так как это позволит вам запускать ваше приложение на XP.

person asmi84    schedule 17.04.2012
comment
Итак, что я получаю, да, КОД d3d11 будет работать на системах d3d9 и 10, но отсутствует так много функций, что не стоит работать над ним. На самом деле я бы хотел, чтобы моей целевой аудиторией было как можно больше людей, но люди с более современным оборудованием получат немного больше удовольствия от просмотра/производительности. я просто не с нетерпением жду кодирования 3 или более разных модулей для обработки 3 или более немного разных API, сохранив недостающие функции в более старых версиях. Итак, я могу или не могу окончательно написать приложение d3d11, которое работает на машинах d3d9 и 10? Или стоило бы просто написать все 3? - person FatalCatharsis; 18.04.2012
comment
DX11 является улучшенной версией DX10, поэтому нет смысла использовать DX10 для аппаратного обеспечения класса DX10. Вы можете прекрасно справляться с HW класса DX10 с DX11 — просто не используйте специфичные для DX11 функции (аппаратная тесселяция, Shader Model 5, многопоточный вывод для геометрических шейдеров и т. д.). Вы МОЖЕТЕ использовать DX11 для аппаратного обеспечения класса DX9, НО это не будет работать в Windows XP, в то время как DX9 SDK будет. Поэтому я бы посоветовал вам придерживаться DX9 SDK, если вы хотите охватить аппаратное обеспечение класса DX9. Или лучший способ — просто отказаться от этого сегмента, поскольку использование DX9 означает использование технологий шестилетней давности, поэтому никаких дополнительных эффектов… - person asmi84; 19.04.2012

Я не верю, что предыдущий комментарий полностью точен.

Возможно, вам потребуется установить среду выполнения DX11 на целевую машину, но вы сможете создать D3D11Device на любой карте, аппаратно совместимой с DX9+.

Но на самом деле это не дает вам многого, потому что вам нужно передать список поддерживаемых вами уровней функций (или NULL, что подразумевает список), а функция имеет выходной параметр, сообщающий вам, какой уровень функций вы получили. Таким образом, карта только для DX9 вернется с D3D_FEATURE_LEVEL_9_1 (или 9_2/9_3).

Уровень функций, в свою очередь, позволяет узнать, какая часть d3d11 вам доступна и как она будет себя вести ( =vs.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/windows/desktop/ff476150(v=vs.85).aspx и http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876(v=vs.85).aspx )

Быстрый вывод из этих диаграмм заключается в том, что DX11, вероятно, подходит для покрытия устройств DX10 и DX11. Это также может подойти для DX9 /в зависимости/ от того, нужны ли вам эти функции.

Вычислительные шейдеры в основном работают на оборудовании DX10 (http://msdn.microsoft.com/en-us/library/windows/desktop/ff476873(v=vs.85).aspx).

person Joe    schedule 17.04.2012
comment
теперь это больше ответ, который я ищу. на самом деле я прошу здесь, если я напишу весь свой код с помощью d3d11 и просто проверю, доступны ли функции из d3d11, и не реализую их, когда это не так, тогда большая часть того же кода будет правильно работать на карта д3д9? так же эффективно или почти так же эффективно, как если бы они были написаны на d3d9? - person FatalCatharsis; 17.04.2012

Нет, он не имеет обратной совместимости. Если вы хотите работать на большем количестве платформ, видеокарта с поддержкой DirectX11, безусловно, будет поддерживать DirectX9. Так что либо разрабатывайте один раз в DX9, либо и в DX11 и в DX9.

person Jeff    schedule 17.04.2012