- [Решено] Black Ops Cold War застряла на компиляции шейдеров
- Попробуйте эти исправления:
- Исправление 1: отсканируйте и восстановите свою игру
- Исправление 2: перезапустите установку шейдеров.
- Исправление 3: обновите графический драйвер
- Исправление 4: Удалить папки кеша
- Исправление 5. Свяжите свои учетные записи Activision и Blizzard.
- Компиляция шейдеров
- Использование расширений файлов кода шейдера
- Компиляция во время сборки в объектные файлы
- Компиляция во время сборки в файлы заголовков
- Компиляция с помощью D3DCompileFromFile
- Что значит компиляция шейдеров
- 16.2.1.1. Получение дескриптора константы
- 16.2.1.2. Установка констант
- 16.2.1.3. Установка значений по умолчанию для констант
- 16.2.2. Компиляция HLSL-шейдера
[Решено] Black Ops Cold War застряла на компиляции шейдеров
Black Ops Cold War Stuck Compiling Shaders
Ниже мы собрали последние исправления этой ошибки совместимости шейдеров, попробуйте их и сразу же вернитесь к игре.
В последнее время геймеры сообщают проблема компиляции шейдеров в Black Ops Cold War, что приводит к зависанию или сбою игры. Если вы оказались в одной лодке, не волнуйтесь. Ниже мы собрали последние исправления этой ошибки, попробуйте их и сразу же вернитесь к игре.
Попробуйте эти исправления:
Возможно, вам не придется пробовать их все. Просто спускайтесь вниз, пока не приземлитесь на ту, которая делает трюк.
- Отсканируйте и восстановите свою игру
- Перезапустите установку шейдеров.
- Обновите свой графический драйвер
- Удалить папки кеша
- Свяжите свои учетные записи Activision и Blizzard
Исправление 1: отсканируйте и восстановите свою игру
Проблема компиляции шейдеров может быть вызвана повреждением или отсутствием файлов игры. Поэтому, прежде чем пробовать что-то более сложное, сначала вам нужно проверить целостность файлов игры.
- Открыть свой Blizzard Battle.net клиент. В левом меню выберите Call of Duty: BOCW .
- Нажмите Опции и выберите Сканировать и восстановить из раскрывающегося меню. Затем дождитесь завершения процесса.
Теперь перезапустите Black Ops Cold War и проверьте, можете ли вы пройти компиляцию шейдеров.
Если проблема не исчезнет, попробуйте следующее исправление, указанное ниже.
Исправление 2: перезапустите установку шейдеров.
Некоторые игроки сообщили, что это может быть просто сбой, который можно исправить с помощью перезапуск установки шейдеров . В таком случае вы можете попробовать то же самое и посмотреть, как идут дела.
Вот как перезапустить установку шейдеров:
- Запустите Black Ops Cold War и перейдите в НАСТРОЙКИ .
- Перейдите к ГРАФИКА таб. Прокрутите вниз и нажмите Перезапустить компиляцию шейдеров .
- Дождитесь завершения переустановки.
Если это решение не решает проблему, обратите внимание на следующее ниже.
Исправление 3: обновите графический драйвер
Проблемы с шейдерами в заголовках COD могут означать, что вы используете сломанный или устаревший графический драйвер . Мы всегда рекомендуем геймерам обновлять драйверы графических процессоров, чтобы избежать проблем с совместимостью. Если вы не знаете, когда в последний раз обновляли драйверы, обязательно сделайте это сейчас.
Вы можете обновить драйвер видеокарты вручную: сначала вам нужно определить модель вашего графического процессора, а затем перейти на веб-сайт производителя ( NVIDIA / AMD ), найдите и загрузите последнюю версию правильного установщика драйверов. Но если у вас нет времени или терпения для обновления вручную, вы можете сделать это автоматически с помощью Водитель Easy .
- Скачать и установите Driver Easy.
- Запустите Driver Easy и щелкните Сканировать сейчас кнопка. Затем Driver Easy просканирует ваш компьютер и обнаружит все проблемные драйверы.
- Нажмите Обновить все для автоматической загрузки и установки правильной версии все драйверы, которые отсутствуют или устарели в вашей системе.
(Для этого требуется Pro версия — вам будет предложено выполнить обновление, когда вы нажмете «Обновить все». Если вы не хотите платить за версию Pro, вы все равно можете загрузить и установить все необходимые драйверы вместе с бесплатной версией; вам просто нужно загрузить их по одному и установить вручную, как обычно в Windows.)
После обновления драйвера графического процессора перезагрузите компьютер, чтобы изменения вступили в силу. Затем запустите игру и проверьте, можете ли вы завершить компиляцию.
Если последняя версия графического драйвера не принесла вам удачи, просто воспользуйтесь следующим методом.
Исправление 4: Удалить папки кеша
Поврежденный кеш может привести к ошибке игры, которая в некоторых случаях останавливает ваш процесс без подсказки. Вы можете попробовать очистить кеш и проверить, решает ли это проблему.
- На клавиатуре нажмите Win + R (клавиша с логотипом Windows и клавиша R), чтобы открыть окно «Выполнить». Введите или вставьте %Данные программы% и нажмите хорошо .
- По одному щелкайте правой кнопкой мыши Battle.net и Blizzard Entertainment папки и выберите Удалить .
- нажимать Win + R опять таки. Введите или вставьте %данные приложения% и нажмите хорошо .
- Щелкните правой кнопкой мыши Battle.net папку и выберите Удалить .
- Снова нажмите Win + R и введите % localappdata% и нажмите хорошо . На этот раз щелкните правой кнопкой мыши Battle.net и Blizzard Entertainment папки и выберите Удалить .
Исправление 5. Свяжите свои учетные записи Activision и Blizzard.
Возможно, у вас застряла компиляция шейдеров, вы не подключили свою учетную запись Blizzard на веб-странице Activision. Вам необходимо убедиться, что ваши учетные записи Activision и Blizzard связаны, чтобы избежать возможных ошибок.
- Посетить Activision веб-сайт и войдите в систему. Затем нажмите ПРОФИЛЬ в правом верхнем углу.
- в СВЯЗЬ С АККАУНТОМ найдите свой профиль и свяжите его со своей учетной записью Battle.net. Затем следуйте инструкциям на экране, чтобы продолжить.
- После завершения перезапустите игру и проверьте, сохраняется ли проблема.
Надеюсь, это руководство поможет вам решить проблему компиляции шейдеров. Если у вас есть какие-либо вопросы или идеи, не стесняйтесь обращаться к нам в комментариях ниже.
Источник
Компиляция шейдеров
В этом разделе описывается FXC.EXE компилятор, используемый для моделей шейдеров 2 – 5,1. Для Shader Model 6 используется DXC.EXE вместо, который описан в статье Использование dxc.exe и dxcompiler.dll.
Microsoft Visual Studio 2012 теперь может компилировать код шейдера из * файлов. hlsl, включаемых в проект C++.
в рамках процесса сборки Visual Studio 2012 использует компилятор кода fxc.exe HLSL для компиляции HLSL файлов в двоичные файловые файлы шейдеров или в байтовые массивы, определенные в файлах заголовков. Как компилятор кода HLSL компилирует каждый файл HLSL в проекте, зависит от того, как указать свойство файлов выходные данные для этого файла. Дополнительные сведения о страницах свойств HLSL см. в разделе страницы свойств HLSL.
Используемый метод компиляции обычно зависит от размера * файла HLSL. Если включить в заголовок большой объем байтового кода, размер и начальное время загрузки приложения будут увеличены. Кроме того, весь байтовый код должен находиться в памяти даже после создания шейдера, что приведет к потере ресурсов. Но при включении в заголовок байтового кода можно уменьшить сложность кода и упростить создание шейдера.
Теперь рассмотрим различные способы компиляции кода шейдера и соглашений для расширений файлов для кода шейдера.
Использование расширений файлов кода шейдера
Чтобы согласовать соглашение с Майкрософт, используйте следующие расширения файлов для кода шейдера:
- Файл с расширением HLSL содержит исходный код на языке штриховки высокого уровня (HLSL).
- Файл с расширением .cso содержит скомпилированный объект шейдера.
- Файл с расширением .h — это файл заголовка, но в контексте кода шейдера этот файл заголовка определяет массив байтов, содержащий данные шейдера.
Компиляция во время сборки в объектные файлы
При компиляции HLSL-файлов в двоичные файловые файлы шейдера приложение должно считывать данные из этих файлов объектов (. cso является расширением по умолчанию для этих объектных файлов), назначать данные байтовые массивы и создавать объекты шейдера из этих массивов байтов. Например, чтобы создать шейдер вершин (ID3D11VertexShader * * ), вызовите метод ID3D11Device:: креатевертексшадер с массивом байтов, который содержит скомпилированный байтовый код шейдера вершин. В примере «учебник по Direct3D » показано, как создавать объекты шейдера из байтовых массивов, полученных из. объектно построителей двоичных файлов шейдера. В этом примере кода из примера учебника по Direct3Dсвойство выходные данные Files для файла симплевертексшадер. HLSL определяет компиляцию в объектный файл симплевертексшадер. cso.
Компиляция во время сборки в файлы заголовков
При компиляции HLSL файлов в байтовые массивы, определенные в файлах заголовков, необходимо включить эти файлы заголовков в код. В примере расширений мультимедиа показано, как создавать объекты шейдера из массивов байтов, определенных в файлах заголовков и включаемых в проект во время компиляции. В этом примере кода из примера расширения мультимедиасвойство выходные данные Files для файла PixelShader. HLSL определяет компиляцию в массив байтов g _ Псшадер , определенный в файле заголовка PixelShader. h.
Компиляция с помощью D3DCompileFromFile
Можно также использовать функцию D3DCompileFromFile во время выполнения для компиляции кода шейдера. Дополнительные сведения о том, как это сделать, см. в разделе инструкции. Компиляция шейдера.
Windows Приложения Магазина поддерживают использование D3DCompileFromFile для разработки, но не для развертывания.
Источник
Что значит компиляция шейдеров
В каждом шейдере есть таблица констант, используемая для хранения его переменных. Библиотека D3DX обеспечивает приложению доступ к таблице констант шейдера через интерфейс ID3DXConstantTable. Через этот интерфейс мы можем устанавливать значения переменных шейдера из кода нашего приложения.
Сейчас мы приведем сокращенный список методов, реализуемых интерфейсом ID3DXConstantTable. Если вам необходим полный список, обратитесь к документации Direct3D.
16.2.1.1. Получение дескриптора константы
Чтобы установить значение какой-нибудь переменной шейдера из кода нашего приложения, необходим способ сослаться на эту переменную. Для этой цели применяется тип D3DXHANDLE. Приведенный ниже метод возвращает значение типа D3DXHANDLE, указывающее на переменную шейдера с заданным именем:
hConstant — Значение D3DXHANDLE задающее родительскую структуру запрашиваемой переменной, определяющую время ее жизни. Например, если мы хотим получить дескриптор отдельного члена объявленной в шейдере структуры данных, то здесь нам надо указать дескриптор этой структуры. Если мы получаем дескриптор переменной самого верхнего уровня, в этом параметре передается 0.
pName — указанное в исходном коде шейдера имя переменной, для которой мы получаем дескриптор.
Например, если имя переменной в коде шейдера ViewProjMatrix и это переменная верхнего уровня, то для получения дескриптора следует написать:
16.2.1.2. Установка констант
Как только наше приложение получило значение D3DXHANDLE, ссылающееся на требуемую переменную в коде шейдера, мы можем установить значение этой переменной из нашего приложения с помощью метода ID3DXConstantTable::SetXXX, где XXX заменяется на название типа переменной, значение которой устанавливается. Например, если мы хотим установить значения массива векторов, следует воспользоваться методом SetVectorArray.
Общий синтаксис всех методов ID3DXConstantTable::SetXXX выглядит так:
pDevice — Указатель на устройство с которым связана таблица констант.
hConstant — Дескриптор, ссылающийся на переменную, значение которой мы устанавливаем.
value — Присваиваемое переменной значение, где XXX заменяется на название типа переменной, значение которой мы устанавливаем. Для некоторых значений (bool, int, float) мы передаем само значение, а для других (векторы, матрицы, структуры) — ссылку на значение.
Если мы инициализируем массив, то у метода SetXXX появляется дополнительный четвертый параметр, задающий количество элементов массива. Например, прототип метода для установки значений массива четырехмерных векторов, выглядит так:
Приведенный ниже список описывает типы, которые мы можем инициализировать с помощью интерфейса ID3DXConstantTable. Подразумевается, что корректное устройство (Device) и корректный дескриптор переменной (handle) уже получены.
SetBool — используется для установки логических значений. Пример вызова:
SetBoolArray — Используется для установки массива логических значений. Пример вызова:
SetFloat — Используется для установки значения с плавающей точкой. Пример вызова:
SetFloatArray — Используется для установки массива значений с плавающей точкой. Пример вызова:
SetInt — Используется для установки целочисленного значения. Пример вызова:
SetIntArray — Используется для установки массива целых чисел. Пример вызова:
SetMatrix — Используется для установки матрицы 4 × 4. Пример вызова:
SetMatrixArray — Используется для установки массива матриц 4 × 4. Пример вызова:
SetMatrixPointerArray — Используется для установки массива указателей на матрицы 4 × 4. Пример вызова:
SetMatrixTranspose — используется для установки транспонированной матрицы 4 × 4. Пример вызова:
SetMatrixTransposeArray — Используется для установки массива транспонированных матриц 4 × 4. Пример вызова:
SetMatrixTransposePointerArray — Используется для установки массива указателей на транспонированные матрицы 4 × 4. Пример вызова:
SetVector — Используется для установки переменной типа D3DXVECTOR4. Пример вызова:
SetVectorArray — Используется для установки массива векторов. Пример вызова:
SetValue — Используется для установки значения произвольного размера, например, структуры. В приведенном примере мы используем SetValue для установки значений D3DXMATRIX:
16.2.1.3. Установка значений по умолчанию для констант
Приведенный ниже метод присваивает всем константам значения по умолчанию, то есть те значения, которые были заданы при объявлении переменных. Метод должен вызываться один раз при инициализации данных приложения.
pDevice — Указатель на связанное с таблицей констант устройство.
16.2.2. Компиляция HLSL-шейдера
Мы можем скомпилировать шейдер, код которого хранится в текстовом файле, с помощью следующей функции:
pSrcFile — Имя текстового файла, содержащего исходный код шейдера, который вы хотите скомпилировать.
pDefines — Необязательный параметр, и в данной книге мы всегда будем указывать в нем null.
pInclude — Указатель на интерфейс ID3DXInclude. Этот интерфейс разработан для тех приложений, которым требуется переопределить устанавливаемое по умолчанию поведение включения. В общем случае поведение по умолчанию замечательно работает и поэтому мы игнорируем данный параметр, передавая в нем null.
pFunctionName — Строка, задающая имя функции, являющейся точкой входа. Например, если точкой входа шейдера является функция с именем Main, мы должны передать в этом параметре строку «Main».
pTarget — Строка, задающая версию шейдеров для которой будет компилироваться исходный код HLSL. Для вершинных шейдеров доступны версии vs_1_1, vs_2_0, vs_2_sw. Для пиксельных шейдеров доступны версии ps_1_1, ps_1_2, ps_1_3, ps_1_4, ps_2_0, ps_2_sw. Например, если мы хотим чтобы наш вершинный шейдер был скомпилирован для версии 2.0, надо указать в этом параметре vs_2_0.
Flags — Необязательные флаги компиляции; если флаги не нужны, укажите 0. Можно использовать следующие значения:
D3DXSHADER_DEBUG — Приказывает компилятору включать в скомпилированный файл отладочную информацию.
D3DXSHADER_SKIPVALIDATION — Приказывает компилятору не выполнять проверку корректности кода. Этот флаг следует использовать только при работе с теми шейдерами в правильности кода которых вы абсолютно уверены.
D3DXSHADER_SKIPOPTIMIZATION — Приказывает компилятору не выполнять оптимизацию кода. Обычно этот флаг используется при отладке, когда вы не хотите, чтобы компилятор вносил какие-либо изменения в код.
ppShader — Возвращает указатель на интерфейс ID3DXBuffer, который содержит скомпилированный код шейдера. Этот скомпилированный код затем передается в параметре другой функции, которая выполняет фактическое создание вершинного или пиксельного шейдера.
ppErrorMsgs — Возвращает указатель на интерфейс ID3DXBuffer, содержащий строку с кодами обнаруженых при компиляции ошибок и их описанием.
ppConstantTable — Возвращает указатель на интерфейс ID3DXConstantTable, содержащий данные таблицы констант шейдера.
Вот пример вызова функции D3DXCompileShaderFromFile:
Источник