Пошаговое руководство. Отладка ошибок отрисовки, возникающих из-за заливки
В этом пошаговом руководстве показано, как использовать диагностику графики Visual Studio для изучения объекта, который окрашен неправильно из-за ошибки шейдера.
В данном пошаговом руководстве демонстрируются указанные ниже возможности.
Используйте документ журнала графики для определения пикселей, которые указывают на проблему.
Используйте окно Журнал пикселей графики чтобы проверить состояние пикселя более внимательно.
Используйте Отладчик HLSL для изучения шейдеров точек и шейдеров вершин.
Скрипт
Неверная расцветка объектов часто имеет место, когда шейдер вершины передает шейдеру пикселей неверные или неполные сведения.
В этом сценарии недавно добавлен объект в приложение, вместе с новыми шейдерами вершин и пикселей для преобразования объекта и присвоения ему уникального внешнего вида. При запуске приложения во время теста, объект отображается сплошным черным. Используя диагностику графики, вы записываете проблему в журнал графики, позволяя отлаживать приложение. В приложении проблема выглядит следующим образом:
Расследование
С помощью инструментов диагностики графики можно загрузить документ журнала графики для проверки кадров, зарегистрированных во время теста.
Как Просмотреть кадр в журнале графики
В Visual Studio загрузите журнал графики, содержащий фрейм, который указывает на отсутствующую модель. В Visual Studio будет отображено новое окно документа журнала графики. В верхней части этого окна находится вывод целевого объекта рендеринга выбранного кадра. В нижней части раздела Список кадров, которая отображает каждый схваченный кадр как эскиз.
В поле Список кадров выберите кадр, в котором объект выглядит неправильно. целевой объект прорисовки обновляется, отражая выбранный кадр. В этом сценарии окно документа журнала графики выглядит следующим образом:
После выбора кадра, который демонстрирует проблему, можно использовать окно Журнал пикселей графики для диагностики. В окне Журнал пикселей графики отображаются примитивы, которые могут влиять на конкретный пиксель, их шейдеры и то, как они повлияли на целевой буфер отрисовки, в хронологическом порядке.
Как Просмотреть точку
Откройте окно Журнал пикселей графики. На панели инструментов Диагностика графики выберите Журнал пикселей.
Выберите пиксель для изучения. В окне документа журнала графики выберите один из пикселей на объекте, который неправильно окрашен:
Окно Журнал пикселей графики обновляется в соответствии с выбранным пикселем. В этом сценарии окно Журнал пикселей графики выглядит следующим образом:
Обратите внимание, что результатом пиксельного шейдера является полностью непрозрачный черный (0, 0, 0, 1), и что Средство слияния вывода совместило это с цветом Предыдущий пикселя таким образом, что Результат тоже представляет собой полностью непрозрачный черный.
После просмотра пикселя, неправильно окрашенного и обнаружения, что результатом построителя текстуры не является ожидаемый цвет, можно использовать отладчик HLSL для изучения построителя текстуры и узнать, что произошло с цветом объекта. Можно использовать отладчик HLSL, чтобы проверить состояние переменных HLSL во время выполнения, пройти по коду HLSL и задать точки останова, чтобы помочь диагностировать проблему.
Как Просмотреть Шейдер пикселей
Запустите отладку шейдера пикселей. В окне Журнал пикселей графики под примитивом объекта рядом с полем Шейдер пикселей нажмите кнопку Начать отладку.
В этом сценарии, поскольку шейдер пикселей просто передает цвет от шейдера вершин, легко увидеть, что проблема не в шейдере пикселей.
Наведите указатель на input.color. Обратите внимание, что его значение — полностью непрозрачный черный (0, 0, 0, 1).
В этом сценарии анализ указывает, что неверный цвет, вероятно, результат действий шейдера вершин, который не предоставляет правильную информацию для шейдера пикселей.
После определения, что шейдер вершин, скорее всего, не предоставляет верных сведений построителю текстуры, на следующем этапе следует выполнить проверку шейдера вершины.
Как Просмотреть Шейдер вершин
Запустите отладку шейдера вершин. В окне Журнал пикселей графики под примитивом объекта рядом с полем Шейдер вершин нажмите кнопку Начать отладку.
Найдите выходную структуру шейдера вершин - это входные данные шейдера текстуры. В этом сценарии имя структуры — output. Просмотрите код вершинного шейдера и обратите внимание, что член color структуры output явно установлен в полностью непрозрачный черный, например, в результате процесса отладки.
Убедитесь, что член цвета никогда не копируется из входной структуры. Поскольку значение output.color установлено в полностью непрозрачный черный непосредственно перед возвратом структуры output, рекомендуется убедиться, что значение output не было правильно инициализировано на предыдущей линии. Пройдите по шагам код вершинного шейдера до тех пор, пока не достигнете линии, на которой output.color устанавливается в черный, и наблюдайте за значением output.color. Обратите внимание, что значение output.color не инициализировано до установки в черный. Это подтверждает, что строка кода, которая устанавливает output.color в черный, должна быть изменена, а не удалена.
После определения, что причиной проблемы отрисовки стало то, что шейдер вершины не предоставляет правильное значение цвета построителю текстуры, эти сведения можно использовать, чтобы устранить проблему. В этом сценарии необходимо изменить следующий код в вершинном шейдере
output.color = float3(0.0f, 0.0f, 0.0f);
в
output.color = input.color;
Этот код просто передает цвет вершины из вершин объекта без изменений - более сложные шейдеры вершины могут изменить цвет перед передачей его. Исправленный код шейдера вершин должен выглядеть примерно следующим образом:
После фиксирования кода перестройте его и снова запустите приложение, чтобы определить, что проблема отрисовки разрешена.