DirectX 11 Эффекты

Я пытаюсь изучить DirectX 11 и пишу небольшое приложение с использованием Visual Studio 2013 для Windows 7. Я слежу за книгой «Введение в программирование 3D-игр с помощью DirectX 11», и до сих пор все прошло хорошо. Я только что подошел к той части книги, где показан пример BoxApp, и я просто работаю над кодом, пытаясь реализовать нечто подобное в моем приложении, чтобы лучше понять, что происходит.

Я столкнулся с проблемой со следующими устаревшими библиотечными функциями, используемыми в примере кода:

D3DX11CompileFromFile(....);
D3DX11CreateEffectFromMemory(...);

Во-первых, чтобы понять, почему они больше не доступны, я понимаю, почему эти функции больше не существуют, потому что заголовочные файлы и библиотеки D3DX устарели для Windows 8. Первоначально они были вспомогательными библиотеками, предоставленными в DirectX SDK для Dx9, а затем предоставляется Os для Dx10 перед тем, как быть устаревшим для Dx11.1 (2)?

Теперь мой главный вопрос: как мне начать компилировать шейдеры и эффекты без устаревших заголовков D3DX? Я просто немного озадачен тем, как правильно это сделать.

Мне кажется, есть два варианта:

  1. Загрузите вспомогательные библиотеки Effects11, которые предоставят аналогичные предыдущие функции.
  2. Используйте библиотеку D3DCompiler и компилируйте эффекты вручную.

Как я уже сказал, я не совсем уверен, какой будет лучший вариант (или даже если есть лучший альтернативный вариант (ы)). Насколько я понимаю, Effects11 был представлен больше для поддержки старого Dx10, который нужно было портировать на Dx11. Поскольку у меня нет кода Dx10 для порта, я не слишком обеспокоен этой поддержкой, я не слишком обеспокоен поддержкой приложений Metro в Windows 8 (я думаю, что это правильный термин для них?), Но если D3DCompiler путь будет означать поддержку приложений метро, ​​а затем я думаю, что это было бы желательно.

В любом случае, любой совет или понимание будут оценены. Заранее спасибо.

2

Решение

Что ж, это может помочь просмотреть историю библиотеки утилит Direct3DX (D3DX). Первоначально он был поставлен как часть DirectX 7 SDK в виде статической библиотеки, которую вы связали непосредственно с вашим приложением. Он охватывал многие из тех же функций, что и сейчас, хотя, в частности, не поддерживал эффекты, потому что шейдеры не были представлены до Direct3D 8.

Все это работало довольно хорошо, пока однажды Microsoft не решила, что статические библиотеки — большая дыра в безопасности. Вероятно, это произошло потому, что обнаружение некоторых неприятных ошибок в GDI + привело к тому, что ряд приложений, использующих GDI +, были уязвимы для эксплойтов, связанных с искаженными изображениями. Несмотря на то, что GDI + поставлялся как DLL, каждое приложение, которое его использовало, устанавливало свою собственную копию в своем собственном каталоге установки. Это означало, что Microsoft не могла просто пропатчить GDI + DLL с помощью обновления Windows, каждое приложение, которое использовало ее, должно было создавать свой собственный патч и распространять его среди своих пользователей.

Поэтому Microsoft решила отправлять разработчикам двоичный код для включения в свои приложения, что было ошибкой. Любой предоставленный Microsoft двоичный код должен был обновляться через Центр обновления Windows. Это означало, что больше не будет общих библиотек и новых ограничений на то, как DLL могут быть перераспределены и установлены. Вот почему вы должны использовать установщик DirectX при перераспределении библиотек D3DX. (Именно поэтому в Visual Studio были все сложные требования, связанные с манифестами с их распространяемыми библиотеками DLL.)

Проблема в том, что это привело к тому, что Microsoft вынуждена была создавать новую версию DLL D3DX каждый раз, когда они меняли ее, то есть почти каждый раз, когда выпускали новую версию SDK. Каждая новая DLL не была обратно совместима со старой DLL, поэтому она получила новое имя. Если вы посмотрите в свой system32 В каталоге вы, вероятно, найдете пару десятков различных библиотек D3DX.

(Очевидно, когда-либо была раскрыта только одна уязвимость в D3DX, CVE-2006-4183. Насколько я могу судить, это было исправлено только в последующих выпусках SDK, не было выпущено исправления для исправления ошибки в старых версиях D3DX DLL.)

В конце концов Microsoft решила прекратить выпуск новых версий DirectX SDK и сделать его частью Windows SDK. Все, кроме D3DX, и, таким образом, это было в значительной степени мёртвым для Microsoft. Без обслуживания, без улучшений и без замены.

Затем однажды Microsoft решила открыть библиотеку D3DX с открытым исходным кодом, потому что я не знаю. Таким образом, мы в значительной степени вернулись к тому, с чего начали, с приложениями, связывающими библиотеку непосредственно со своими исполняемыми файлами. За исключением того, что сейчас это открытый исходный код, а не бинарный, поэтому любые ошибки, связанные с безопасностью, не являются проблемой Microsoft.

Так что у вас в основном у вас есть четыре варианта:

  • использовать D3DX DLL из последнего выпуска DirectX SDK (июнь 2010 г.)
  • использовать библиотеку Effect11 с открытым исходным кодом
  • написать свой собственный код
  • использовать какое-то стороннее промежуточное ПО

Первый вариант означает, что вам, вероятно, понадобится связать RedX Redist с вашим установщиком. Также заставить его работать более новые версии Visual Studio — довольно сложная процедура. Второй вариант означает, что вы несете полную ответственность за то, чтобы заставить его работать. То же самое относится и к третьему варианту, и это потенциально намного больше работы. Четвертый вариант может не существовать. Поэтому я думаю, что сегодня, как новый программист Direct3D, лучше всего использовать библиотеки с открытым исходным кодом.

Другой вариант — использовать уже установленный игровой движок, такой как Unreal или Unity, но я предполагаю, что вы уже обесценили эту возможность.

9

Другие решения

Последняя версия «Effects 11» включена CodePlex.

На данный момент есть две основные проблемы с использованием Effects 11:

(1) Профиль fx_5_0 HLSL, необходимый для создания шейдера (или действительно шейдеров плюс метаданные), который требуется для использования «Эффектов 11», не рекомендуется. В настоящее время он работает «как есть» в последнем общедоступном D3DCompiler (# 47), хотя некоторые из более новых конструкций эпох «DirectX 11.1» и «DirectX 11.2», которые работают в других 5_0 профилях, не могут скомпилироваться с «fx_5_0». Официально это устарело и, как ожидается, будет удалено в будущем выпуске компилятора HLSL.

(2) «Эффекты 11» требуют наличия API D3DCompile, доступного во время выполнения. Это было проблемой для приложений Магазина Windows в Windows 8.0 и Windows Phone 8.0, потому что вы могли использовать только D3DCompile для разработки. В приложениях Магазина Windows для Windows 8.1 и Windows Phone 8.1 D3DCompile # 47 доступен для развернутых приложений Магазина. Это означает, что теоретически вы можете использовать «Эффекты 11» для этой цели, но это не рекомендуется.

В разделе обсуждения «Эффекты 11» CodePlex фактически есть ответы на ряд ваших вопросов:

Эффекты 11 устарели?

Как мне избежать использования fx_5_0?

Среда выполнения «Effects 11» по-прежнему весьма полезна в качестве инструмента для изучения HLSL в целом, и я использовал его для публикации нескольких старых DirectX SDK образцы а также учебные пособия для образовательной ценности.

Что касается того, стоит ли вам вкладывать средства в его изучение или долгосрочное использование, это полностью ваше дело.

Для начинающих, которые просто хотят кодировать с Direct3D 11, вы можете использовать Набор инструментов DirectXBasicEffect, который имеет набор «стандартных» шейдеров и решает все константы и другие вопросы без использования «Эффектов 11» вообще. Вы также можете попробовать использовать Visual Studio Shader Designer (DGSL) (также поддерживается DirectX Tool Kit), если вы хотите поиграть с некоторыми из вещей, которые вы можете здесь сделать, хотя это действительно гораздо больше «игрушечного» решения, но может быть полезным. В любом случае, вы можете использовать этот опыт, чтобы научиться писать свою собственную систему «эффектов».

2

По вопросам рекламы [email protected]