Поделиться через


Пошаговое руководство. Отсутствие объектов вследствие состояния устройства

В этом пошаговом руководстве показано, как использовать диагностику графики Visual Studio для изучения объекта, который отсутствует из-за неправильно настроенного состояния устройства.

В данном пошаговом руководстве демонстрируются указанные ниже возможности.

  • Используйте Список событий графики, чтобы обнаружить потенциальные источники проблемы.

  • Используйте окно Этапы графического конвейера для проверки эффекта вызовов API Direct3D DrawIndexed.

  • Используйте окно Журнал пикселей графики чтобы точнее найти проблему.

  • Проверьте состояние устройства на предмет возможных проблем или неверной настройки.

Скрипт

Одной из причин того, что объекты в приложении трехмерной графики находятся не там, где они должны быть, является неправильная настройка графического устройства, из-за которой объекты исключаются из отрисовки — например, когда порядок заполнения приводит к ошибочному удалению треугольников, или когда функция проверки глубины приводит к отклонению всех пикселей в объекте.

В сценарии, который описан в данном пошаговом руководстве, только что был достигнут первый контрольный этап разработки 3D-приложения. Пользователь готов выполнить первое тестирование приложения. Однако при запуске приложения на экране отрисовывается только пользовательский интерфейс. Используя диагностику графики, вы записываете проблему в файл журнала графики, позволяя отлаживать приложение. В приложении проблема выглядит следующим образом:

Приложение до исправления проблемы

Сведения о том, как захватывать проблемы графики в журнал графики см. в разделе Запись графических сведений.

Расследование

С помощью инструментов диагностики графики можно загрузить файл журнала графики для проверки кадров, зарегистрированных во время теста.

Как Просмотреть кадр в журнале графики

  1. В Visual Studio загрузите журнал графики, содержащий фрейм, который указывает на отсутствующую модель. Новая вкладка диагностики графики отображается в Visual Studio. В верхней части этой вкладки находится отображенный целевой вывод выбранного кадра. В нижней части раздела Список кадров, которая отображает каждый схваченный кадр как эскиз.

  2. В поле Список кадров выберите кадр, который демонстрирует, что модель не отображается. целевой объект прорисовки обновляется, отражая выбранный кадр. В этом сценарии вкладка журнала графики выглядит следующим образом:

    Предварительный просмотр и список кадров буфера кадров вкладки .vsglog

После выбора кадра, который демонстрирует проблему, можно использовать Список событий графики для диагностики. Список событий графики содержит все вызовы API Direct3D, которое были выполнены для отрисовки активного кадра, например вызовы API для настройки состояния устройства, создания и обновления буферов и рисования объектов, которые присутствуют в кадре. Существует много типов вызовов, которые интересны поскольку часто (но не всегда) происходит соответствующее изменение в целевом объекте отрисовки, когда приложение работает, как ожидалось. Например, вызовы Draw, Dispatch, Copy или Clear. Вызовы рисования особенно интересны, поскольку каждый из них представляет геометрию, отрисованную приложением (вызовы диспетчера также могут отрисовывать геометрию).

Как Убедиться в том, что вызовы рисования совершаются

  1. При необходимости откройте окно Список событий графики. На панели инструментов Диагностика графики выберите Список событий.

  2. Проверьте Список событий графики на предмет вызовов рисования. Чтобы сделать это проще, введите «Рисование» в окне Поиск в правом верхнем углу окна Список событий графики. Это фильтрует список, чтобы он будет содержать только события с «Draw» в своих именах. В этом сценарии будет обнаружено, что несколько вызовов рисования были сделаны:

    Список событий графики, содержащий захваченные события

После подтверждения, что Вызовы рисования выполняются, можно указать, какой из них соответствует отсутствующей геометрии. Так как известно, что отсутствующая геометрия не рисуется в целевом объекте прорисовки (в данном случае), можно использовать окно Этапы графического конвейера, чтобы определить, какой вызов рисования соответствует отсутствующей геометрии. В окне Этапы графического конвейера отображается геометрия, отправляемая каждому вызову рисования, независимо от оказываемого им воздействия на целевой буфер отрисовки. По мере продвижения через вызовы рисования этапы конвейера обновляются для указания геометрии, связанной с этим вызовом, и целевой результат отрисовки обновляется для отображения состояния целевого объекта отрисовки после выполнения вызова.

Поиск вызова рисования для отсутствующей геометрии

  1. Откройте окно Этапы графического конвейера. На панели инструментов Диагностика графики выберите Этапы конвейера.

  2. Пройдите по всем вызовам рисования, наблюдая за окном Этапы графического конвейера на предмет отсутствующей модели. Этап Сборщик входных данных показывает необработанные данные модели. Этап Шейдер вершин указывает преобразованные данные модели. Этап Шейдер пикселей показывает вывод шейдера пикселей. Этап Средство слияния вывода показывает объединенный целевой буфер отрисовки для данного вызова рисования и всех предыдущих вызовов рисования.

  3. Дойдя до вызова рисования, соответствующего отсутствующей модели, остановитесь. В этом сценарии окно Этапы графического конвейера указывает, что геометрия была отрисована, но не отображается в целевом объекте отрисовки:

    Средство просмотра конвейера с отсутствующим объектом

После подтверждения, что приложение отрисовало отсутствующую геометрию и нахождения соответствующего вызова рисования можно выбрать часть результата целевого объекта отрисовки, которая должна отображать отсутствующую геометрию, а затем использовать окно Журнал пикселей графики, чтобы выяснить, почему пиксели были исключены. Журнал пикселей содержит список всех вызовов рисования, которые могли повлиять на конкретный пиксель. Каждый вызов рисования в окне Журнал пикселей графики идентифицируется по номеру, который также отображается в окне Список событий графики. Это помогает убедиться, что пиксель должен отображать отсутствующую геометрию, и выяснить, почему пиксель был исключен

Определение, почему пиксель был исключен

  1. Откройте окно Журнал пикселей графики. На панели инструментов Диагностика графики выберите Журнал пикселей.

  2. На основе эскиза Шейдер пикселей выберите пиксель в выводе буфера кадров, который должен содержать часть отсутствующей геометрии. В этом сценарии вывод шейдера пикселей должен охватывать большую часть целевого объекта отрисовки. После того как пиксель выбран, окно Журнал пикселей графики выглядит следующим образом:

    Окно журнала пикселей, в котором показаны соответствующие вызовы draw

  3. Убедитесь, что выбранный пиксель целевого объекта прорисовки содержит часть геометрии, сопоставив номер проверяемого вызова рисования (из окна Список событий графики ) с одним из вызовов рисования в окне Журнал пикселей графики. Если ни один из вызовов в окне Журнал пикселей графики не совпадает с проверяемым вызовом рисования, повторите эти шаги (за исключением шага 1) до тех пор, пока не будет найдено совпадение. В этом сценарии соответствующий вызов рисования выглядит следующим образом:

    Окно журнала пикселей, в котором показаны сведения о фрагменте

  4. Если обнаружится совпадение, разверните соответствующий вызов рисования в окне Журнал пикселей графики и убедитесь, что пиксель был исключен. Каждый вызов рисования в окне Журнал пикселей графики соответствует одному или нескольким геометрическим примитивам (точкам, линиям или треугольникам), которые проходят через этот пиксель по причине геометрии соответствующего объекта. Каждое такое пересечения может повлиять на окончательный цвет пикселя. Примитив, который исключен, поскольку он не прошел тест глубины, представлен значком в виде буквы Z над стрелкой, наклоненной вниз слева направо.

  5. Разверните исключенный примитив, чтобы далее изучить состояние, которое вызвало его исключение. В группе Средство слияния вывода наведите указатель мыши на Результат. Подсказка указывает, почему примитив был исключен. В этом сценарии анализ указывает, что примитив был исключен, поскольку он провалил тест глубины, и, следовательно, не участвует в конечном цвете пикселя.

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

Как Просмотреть состояние устройства

  1. Откройте окно Таблица графических объектов. На панели инструментов Диагностика графики выберите Таблица объектов.

  2. Найдите объект Устройство D3D10 в Таблица графических объектов, а затем откройте объект Устройство D3D10. Новая вкладка устройства d3d10 открывается в Visual Studio. Чтобы сделать это проще, можно выполнить сортировку Таблицы графических объектов по Тип:

    Таблица графических объектов и состояние связанного устройства

  3. Изучите состояние устройства, которое отображается на вкладке устройство d3d10, на предмет возможных проблем. Поскольку геометрия не отображается, поскольку ее примитивы не прошли тест глубины, можно сфокусироваться на состоянии устройства, например шаблон глубины, который оказывает влияние на тест глубины. В этом сценарии состояние трафарета глубинысостояние средства слияния вывода) содержит не общее значение для элемента функция глубины, D3D10_COMPARISON_GREATER:

    Окно устройства D3D10, содержащее сведения о трафарете глубины

После определения, что причиной проблемы отрисовки может быть неправильно настроенная функция глубины, эти сведения можно использовать вместе с набором знаний кода для нахождения, когда функция глубины была установлена неправильно, а затем устранить проблему. Если вам не знаком этот код, можно выполнить поиск проблем путем использования ключей, собранных во время отладки, например, на основании описания трафарета глубины в этом сценарии можно выполнить поиск в коде таких слов, как "глубина" или "БОЛЬШЕ". После фиксирования кода перестройте его и снова запустите приложение, чтобы определить, что проблема отрисовки разрешена:

Приложение после исправления проблемы