Различные ошибки DirectX
Ошибка DirectX – далеко не редкое явление. Эти библиотеки весьма чувствительны к драйверам, настройкам операционной системы и прочим штукам. Поэтому сбои случаются довольно часто. И нужно знать все о том, как им противостоять. Рассмотрим самые популярные ситуации.
Устранение неполадок
В данном материале мы рассмотрим те сбои ДиректХ, которые встречаются чаще всего в повседневной жизни. Естественно, мы расскажем и о том, как их исправить. Но в тексте будет много сложного. Так что внимательно читайте инструкции.
DirectX function device CreateTexture2D
Если появляется ошибка «DirectX function device CreateTexture2D», то, вероятнее всего, виноваты драйвера видеокарты. Бывает так, что в старых драйверах не хватает куска кода, который требуется для нормальной работы видеокарты с той или иной версией библиотеки. Это случается из-за недосмотра разработчиков. Однако в новых версиях ПО ошибка может быть устранена.
Для обновления драйвера вовсе не обязательно посещать официальный сайт разработчика, скачивать нужную версию драйвера и устанавливать ее вручную. Гораздо проще и безопаснее использовать для обновления инструменты Windows.
Сейчас мы рассмотрим вариант обновления с помощью «Диспетчера устройств» Windows:
По завершении обновления необходимо перезагрузить компьютер. Только после рестарта система сможет инициализировать новый драйвер и начать его использовать. После рестарта можно пробовать запускать проблемную игру. Если ошибка все еще остается, то стоит попробовать еще один вариант.
Unable to create DirectX 11 device
А вот ошибка «Unable to create DirectX 11 device», наоборот, может появиться после обновления драйвера, если в его коде есть какой-то баг. Если это сбой обнаружился только после обновления, то это значит, что в новой версии ПО присутствует какой-то баг, мешающий нормальной работе графического адаптера и системных библиотек.
Откат также осуществляется при помощи встроенных инструментов операционной системы Windows. Но для его осуществления требуются немного другие шаги, чем для обновления драйвера. Впрочем, мы в любом случае предоставим подробную инструкцию, рассказывающую о данном процессе. Вот она:
Как водится, после работы с драйверами обязательно нужно перезагрузить компьютер. Иначе система просто не увидит другой драйвер и попытается работать со старым, что приведет к падению ОС. После рестарта можно проверять игру на наличие ошибок. Если и этот вариант не помог, то у нас в запасе есть еще несколько.
The Launcher cannot query DirectX
DirectX function device createbuffer
Для появления ошибки «DirectX function device createbuffer» тоже имеется свое объяснение. Если на вашем компьютере находились полчища вирусов, то вполне вероятно, что они могли повредить некоторые системные файлы, ответственные за работу библиотек DirectX. Отсюда и постоянные ошибки при запуске той или иной игрушки. Также могут возникнуть конфликты в работе драйверов и компонентов библиотек.
Однако даже если файлы сильно повреждены, есть возможность вернуть все на круги своя. Для восстановления элементов даже не нужно никаких дополнительных программ. Достаточно командной строки. Бояться ее не стоит. Если все выполнять в строгом соответствии с инструкцией, то ничего страшного не случится. А вот и она:
Проверка файлов и их восстановление займет около 10-15 минут. Не забудьте, что после окончания проверки обязательно нужно будет перезагрузить компьютер. Иначе в восстановлении не будет никакого толку. После рестарта можно проверять работоспособность библиотек DirectX и любимой игрушки. Если это не помогло, то остается всего один вариант.
Не удается создать устройство DirectX
Если «Не удается создать устройство DirectX», то такое поведение может быть также связано с работой антивируса или системного брандмауэра. Эти программы любят блокировать все подряд. Даже несмотря на то, что перед ними вовсе не вредоносный объект. Вероятно, они блокируют и некоторые компоненты библиотек Директ Икс.
Самым правильным шагом будет временное отключение защиты. Достаточно это сделать для антивируса. Просто найдите его иконку в трее Windows, кликните по ней ПКМ и выберите соответствующую опцию.
DirectX encountered an unrecoverable error
При появлении ошибки с текстом «DirectX encountered an unrecoverable error» остается только одно – переустановка. Ведь, вероятнее всего, вирусы повредили какие-то файлы самих библиотек. Поэтому и появляются ошибки такого типа. И именно поэтому видеокарта не может нормально работать с DirectX. Если это действительно так, то приятного в этом мало.
Здесь поможет только полная переустановка компонента. Данная процедура очень простая в исполнении, ведь от пользователя требуется просто скачать и запустить специальную утилиту. Подробности о ней изложены в отдельной статье, с которой мы и предлагаем вам ознакомиться. Это же действие нередко спасает и при сбое DirectX error 0x887a0004.
Your graphics card does not support DirectX 11 features
Некоторые ошибки указывают на аппаратную проблему. Да, именно на ту, которая связана с железом компьютера. И здесь мы вряд ли что-нибудь сможем сделать.
Ошибка с текстом Your graphics card does not support DirectX 11 features недвусмысленно говорит о том, что у вас слишком древний графический адаптер, который не поддерживает DirectX 11. И такое действительно случается. Под раздачу даже попадают видеокарты 2011 года выпуска. И неудивительно. Ведь они поддерживают только версию 10.1.
Решение проблемы простое. Нужно пойти в магазин и купить новую видеокарту. Есть еще один вариант: отказаться от идеи запуска той игры, которая выдала такую ошибку. Все равно ничего не получится до тех пор, пока вы не обновите свое оборудование. Эту ошибку исправить невозможно другими способами.
Заключение
В рамках данного материала мы поговорили о том, что делать, если вдруг возникла неустранимая ошибка DirectX. Если именно так написано в окне с ошибкой, то это еще ничего не значит. В большинстве случаев ее можно устранить. Если, конечно, она имеет программный характер, а не связана с аппаратными частями компьютера.
Для решения программных проблем существует много способов. Все они перечислены чуть выше. Некоторые из них могут показаться вам довольно сложными. Но не стоит паниковать. Нужно выполнять все в строгом соответствии с инструкцией. Только в этом случае можно надеяться, что проблема будет решена и библиотеки заработают так, как им положено. Кстати, если вы поняли, что проблема имеет аппаратный характер, то не пытайтесь ремонтировать видеокарту сами. Вы ее только убьете.
Рисование с помощью Render Targets в Unreal Engine
Render target — это, по сути, текстура, в которую можно выполнять запись во время выполнения приложения. С точки зрения движка они хранят такую информацию, как базовый цвет, нормали и ambient occlusion.
С точки зрения пользователя render target в основном используются в качестве своего рода дополнительной камеры. Можно задать захват сцены (scene capture) в какой-то точке и сохранять изображение в render target. Затем можно отобразить render target на меше, например, для симуляции камеры наблюдения.
После выпуска версии движка 4.13 компания Epic добавила возможность отрисовки материалов непосредственно на render target с помощью блюпринтов. Эта функция позволяет создавать сложные эффекты, например, симуляцию жидкости и деформацию снега. Звучит потрясающе, правда? Но прежде чем переходить к таким сложным эффектам, лучше всего освоиться с чем-то простым. Что может быть проще, чем рисование на render target?
В этом туториале вы научитесь следующему:
Примечание: в этом туториале подразумевается, что вы уже знакомы с основами работы в Unreal Engine. Если вы новичок в Unreal Engine, то изучите нашу серию туториалов из десяти частей Unreal Engine для начинающих.
Приступаем к работе
Начнём с загрузки материалов для этого туториала (взять их можно здесь). Распакуйте их, перейдите к CanvasPainterStarter и откройте CanvasPainter.uproject. Если вы нажмёте Play, то увидите следующее:
Квадрат посередине (canvas) — это то, на чём мы будем рисовать. Элементы UI слева будут текстурой, которой мы будем рисовать, и её размером.
Для начала давайте разберёмся со способом, который используется для рисования.
Способ рисования
Первое, что нам нужно — это render target, используемый в качестве холста (canvas). Для определения того, где выполнять рисование на render target, мы оттрассируем прямую, выходящую из камеры вперёд. Если прямая пересекает холст, то мы можем получить место пересечения в UV-пространстве.
Например, если холст имеет идеальную привязку UV-координат, то пересечение в центре вернёт значение (0.5, 0.5). Если прямая пересекает холст в правом нижнем углу, то мы получим значение (1, 1). Затем можно использовать простые вычисления для расчёта места рисования.
Но зачем получать координаты в UV-пространстве? Почему бы не использовать координаты настоящего пространства мира? При использовании пространства мира нам сначала придётся вычислять место пересечения относительно плоскости. Также придётся учитывать поворот и масштаб плоскости.
При использовании UV-пространства все эти вычисления не требуются. На плоскости с идеальной привязкой UV-координат пересечение с серединой всегда возвращает (0.5, 0.5), вне зависимости от расположения и поворота плоскости.
Примечание: рассматриваемый в этом туториале метод в общем случае работает только с плоскостями или похожими на плоскости поверхностями. Для других типов геометрии требуется более сложный метод, который я рассмотрю в другом туториале.
Сначала мы создадим материал, который будет отображать render target.
Создание материала холста
Перейдите в папку Materials и откройте M_Canvas.
В этом туториале мы будем создавать render target динамически, с помощью блюпринтов. Это значит, что нам придётся настроить текстуру как параметр, чтобы можно было передавать его render target. Для этого создадим TextureSampleParameter2D и назовём его RenderTarget. Затем соединим его с BaseColor.
Пока не беспокойтесь о выборе текстуры — мы займёмся этим дальше в блюпринтах. Нажмите Apply, а затем закройте M_Canvas.
Следующим этапом будет создание render target, после чего мы используем его в качестве материала холста.
Создание Render Target
Существует два способа создания render target. Первый: создание в редакторе нажатием на Add New\Materials & Textures\Render Target. Этот способ позволяет удобно ссылаться на один и тот же render target нескольким акторам. Однако если нам понадобятся несколько холстов, то придётся создавать render target вручную для каждого холста.
Поэтому лучше создавать render target с помощью блюпринтов. Преимущество такого подхода в том, что мы создаём render targets только при необходимости и они не раздувают объём файлов проекта.
Для начала нам нужно создать render target и сохранить его как переменную для дальнейшего использования. Перейдите в папку Blueprints и откройте BP_Canvas. Найдите Event BeginPlay и добавьте выделенные узлы.
Присвойте параметрам Width и Height значение 1024. Так мы изменим разрешение render target на 1024×1024. Чем больше значения, тем выше качество изображения, но и больше затраты видеопамяти.
Далее идёт нод Clear Render Target 2D. Мы можем использовать этот нод для задания цвета render target. Задайте Clear Color значение (0.07, 0.13, 0.06). При этом весь render target заполнится зеленоватым цветом.
Теперь нам нужно отобразить render target на меше холста.
Отображение Render Target
На данном этапе меш холста использует материал по умолчанию. Для отображения render target нужно создать динамический экземпляр M_Canvas и передать ему render target. Затем нужно применить динамический экземпляр материала к мешу холста. Для этого мы добавим выделенные ноды:
Сначала перейдём к ноду Create Dynamic Material Instance и зададим в качестве Parent значение M_Canvas. Так мы создадим динамический экземпляр M_Canvas.
Далее перейдём к ноду Set Texture Parameter Value и зададим для Parameter Name значение RenderTarget. Так мы передадим render target созданному ранее параметру текстуры.
Теперь на меше холста будет отображаться render target. Нажмите на Compile и вернитесь в основной редактор. Нажмите на Play, чтобы увидеть, как холст изменит цвет.
Теперь, когда у нас есть холст, нам нужно создать материал, который можно использовать в качестве кисти.
Создание материала кисти
Перейдите в папку Materials. Создайте материал M_Brush и откройте его. Сначала задайте для Blend Mode значение Translucent. Это позволит нам использовать текстуры с прозрачностью.
Как и в случае с материалом холста, мы задаём текстуру для кисти в блюпринтах. Создайте TextureSampleParameter2D и назовите его BrushTexture. Соедините его следующим образом:
Нажмите на Apply, а затем закройте M_Brush.
Следующее, что нужно сделать — создать динамический экземпляр материала кисти, чтобы можно было менять текстуру кисти. Откройте BP_Canvas и добавьте выделенные узлы.
Далее перейдите в нод Create Dynamic Material Instance и задайте для Parent значение M_Canvas.
Мы создали материал кисти, и теперь нам нужна функция для рисования кистью на render target.
Рисование кистью на Render Target
Создайте новую функцию и назовите её DrawBrush. Сначала нам понадобятся параметры: используемая текстура, размер кисти и место для рисования. Создайте следующие входные входные данные:
Прежде чем рисовать кисть, нам нужно задать её текстуру. Для этого создадим схему, показанную ниже. Убедитесь, что в качестве Parameter Name выбрано значение BrushTexture.
Теперь нам нужно выполнять отрисовку в render target. Для этого создадим выделенные ноды:
Begin Draw Canvas to Render Target позволит движку узнать, что мы хотим начать отрисовку в определённый render target. Draw Material позволит отрисовывать материал по указанному местоположению с выбранным размером и поворотом.
Вычисление позиции отрисовки — это двухэтапный процесс. Сначала нам нужно отмасштабировать DrawLocation, чтобы уместиться в разрешение render target. Для этого умножим DrawLocation на Size.
По умолчанию движок будет отрисовывать материалы, используя в качестве исходной точки верхний левый угол. Поэтому текстура кисти не будет центрирована нам, где мы хотим выполнить отрисовку. Чтобы исправить это, нам нужно поделить BrushSize на 2, а затем вычесть результат из предыдущего этапа.
Затем соединим всё следующим образом:
Наконец нам нужно сообщить движку, что мы хотим остановить отрисовку в render target. Добавим нод End Draw Canvas to Render Target и соединим его следующим образом:
Теперь при каждом выполнении DrawBrush она будет сначала устанавливать в качестве текстуры для BrushMaterial передаваемую текстуру. Затем она будет отрисовывать BrushMaterial в RenderTarget, пользуясь переданными позицией и размером.
И на этом функция отрисовки готова. Нажмите на Compile и закройте BP_Canvas. Следующим шагом будет трассировка прямой из камеры и рисование в том месте холста, где произошло пересечение.
Трассировка прямой из камеры
Прежде чем рисовать на холсте, нам нужно указать текстуру кисти и размер. Перейдём в папку Blueprints и откроем BP_Player. Затем присвоим переменной BrushTexture значение T_Brush_01, а переменной BrushSize значение 500. Так мы назначим кисти изображение обезьяны размером 500×500 пикселей.
Далее необходимо выполнить трассировку прямой. Найдите InputAxis Paint и создайте следующую схему:
Так мы будем выполнять трассировку прямой, направленной из камеры прямо, пока игрок будет удерживать клавишу, назначенную для Paint (в нашем случае это левая клавиша мыши).
Теперь нам необходимо проверить, пересекла ли прямая холст. Добавим выделенные ноды:
Теперь при пересечении прямой и холста будет выполняться функция DrawBrush, использующая переданные ей переменные кисти и UV-координаты.
Чтобы нод Find Collision UV заработал, нам нужно изменить два параметра. Во-первых, перейдём в нод LineTraceByChannel и включим Trace Complex.
Во-вторых, перейдём в Edit\Project Settings, а затем в Engine\Physics. Включим Support UV From Hit Results и перезапустим проект.
После перезапуска для рисования на холсте нажмите Play и левую клавишу мыши.
Можно даже создать несколько холстов и рисовать на каждом из них отдельно. Это возможно, потому что каждый холст динамически создаёт собственный render target.
В следующем разделе мы реализуем функционал изменения игроком размера кисти.
Изменение размера кисти
Откройте BP_Player и найдите нод InputAxis ChangeBrushSize. Эта привязка оси настроена на использование колеса мыши. Для изменения размера кисти нам достаточно менять значение BrushSize в зависимости от Axis Value. Для этого создадим следующую схему:
Она будет выполнять прибавление или вычитание из BrushSize при использовании игроком колеса мыши. Первое умножение определяет скорость прибавления или вычитания. В качестве меры безопасности добавлено Clamp (float). Он гарантирует, что размер кисти не станет меньше 0 или больше 1000.
Нажмите на Compile и вернитесь в основной редактор. Покрутите колесо мыши, чтобы изменить размер кисти при рисовании.
В последнем разделе мы создадим функционал, позволяющий игроку менять текстуру кисти.
Изменение текстуры кисти
Для начала нам нужен массив для хранения текстур, которые может использовать игрок. Откройте BP_Player и создайте переменную array. Выберите для неё тип Texture 2D и назовите её Textures.
Затем создайте три элемента в Textures. Присвойте им следующие значения:
Это будут текстуры, которыми сможет рисовать игрок. Для добавления новых текстур достаточно добавить их в этот массив.
Далее нам необходима переменная для хранения текущего индекса массива. Создайте переменную integer и назовите её CurrentTextureIndex.
Далее нам необходим способ обхода в цикле всех текстур. Для этого туториала я настроил привязку действия (action mapping) под названием NextTexture и привязал её к правой клавише мыши. Когда игрок нажимает эту клавишу, должен выполняться переход к следующей текстуре. Для этого найдите нод InputAction NextTexture и создайте следующую схему:
Эта схема будет увеличивать CurrentTextureIndex при каждом нажатии на правую клавишу мыши. Если индекс достигает конца массива, то он снова сбрасывается на 0. Наконец, BrushTexture задаётся соответствующая текстура.
Нажмите на Compile и закройте BP_Player. Нажмите Play и щёлкайте правой клавишей мыши для переключения между текстурами.
Куда двигаться дальше?
Готовый проект можно скачать отсюда.
Render target — это чрезвычайно мощный инструмент и в этом туториале мы затронули только самые основы. Если вы хотите узнать, на что способны render targets, посмотрите Content-Driven Multipass Rendering in UE4. В этом видео есть примеры рисования карт потоков, объёмного рисования, симуляции жидкостей и многого другого.
Также посмотрите наше обучающее видео Blueprint Drawing to Render Targets, чтобы узнать, как создать с помощью render target рисовалку карты высот.


































