Udostępnij za pośrednictwem


Wskazówki: brak obiektów spowodowany stanem urządzenia

W tym instruktażu przedstawiono sposób użycia programu Visual Studio Graphics Diagnostics do zbadania obiektu brakującego z powodu niepoprawnej konfiguracji stanu urządzenia.

W tym instruktażu przedstawiono sposób:

  • Lista zdarzeń grafiki umożliwia zlokalizowanie potencjalnych źródeł problemu.

  • Użyj okna Etapy potoku grafiki, aby sprawdzić efekt wywołań interfejsu Direct3D API DrawIndexed.

  • Użyj okna Historia pikseli grafiki, aby bardziej szczegółowo zlokalizować problem.

  • Sprawdź stan urządzenia pod kątem potencjalnych problemów lub błędów konfiguracji.

Scenariusz

Jednym z powodów niewyświetlania obiektów, kiedy oczekuje się ich w aplikacji 3D, jest błąd konfiguracji urządzenia powodujący, że obiekty są wykluczone z renderowania grafiki — na przykład, kiedy kolejnośc zawijania sprawia, że trójkąty zbierają się w błąd lub gdy funkcja testu głębokości powoduje odrzucenie wszystkich pikseli w obiekcie.

W scenariuszu opisanym w tym przewodniku osiągnięto właśnie pierwszy kamień milowy w tworzeniu aplikacji 3-D i możesz przystąpić do testowania jej po raz pierwszy.Jednak po uruchomieniu aplikacji tylko interfejs użytkownika jest renderowany na ekranie.Przy użyciu programu Graphics Diagnostics można przechwytywać problemy do pliku dziennika grafiki, dzięki czemu można debugować aplikację.Problem w aplikacji wygląda następująco:

Aplikacji przed problemu

Informacje o sposobach przechwytywania problemów z grafiką w dzienniku grafiki — zobacz Przechwytywanie informacji graficznych.

Dochodzenie

Za pomocą narzędzi programu Graphics Diagnostics można załadować plik dziennika grafiki, aby skontrolować klatki, które zostały przechwycone podczas testu.

Aby sprawdzić ramkę w dzienniku grafiki

  1. W programie Visual Studio załaduj dziennik grafiki zawierający ramkę, która wykazuje brak modelu.Nowa karta programu Graphics Diagnostics pojawia się w programie Visual Studio.W górnej części tej karty jest obiekt docelowy renderowania zaznaczonej klatki.W dolnej części jest sekcja Lista klatek, która wyświetla każdą przechwyconą klatkę jako obraz miniatury.

  2. W oknie Lista klatek zaznacz klatkę, która pokazuje, że model nie jest wyświetlany.Obiekt docelowy renderowania został zaktualizowany, aby odzwierciedlić wybraną ramkę.W tym scenariuszu karta dziennika grafiki wygląda następująco:

    .Vsglog karta obiektu preview i ramki listy

Po zaznaczeniu klatki, która demonstruje problem, można użyć okna Lista zdarzeń grafiki do zdiagnozowania go.Lista zdarzeń graficznych zawiera wszystkie wywołania API Direct3D, które zostały wykonane w celu renderowania aktywnej ramki, np. wywołania interfejsu API w celu konfiguracji stanu urządzenia, utworzenia i aktualizacji buforów oraz narysowania obiektów pojawiających się w ramce.Wiele rodzajów wywołań jest interesujących, ponieważ często (ale nie zawsze) jest odnośna zmiana obiekcie docelowym renderowania, gdy aplikacja działa zgodnie z oczekiwaniami, na przykład przy wywołaniach rysowania, wysyłki, kopiowania lub czyszczenia.Wywołania rysowania są szczególnie interesujące, ponieważ każde z nich reprezentuje geometrię wyrenderowaną przez aplikację (wywołania wysyłki również mogą renderować geometrię).

Aby zapewnić, że wykonywane są wywołania rysunku

  1. Otwórz okno Lista zdarzeń grafiki.Na pasku narzędzi programu Graphics Diagnostics wybierz przycisk Lista zdarzeń.

  2. Poszukaj w oknie Lista zdarzeń grafiki wywołań rysowania.Aby to ułatwić, wprowadź "Draw" w polu Wyszukaj w prawym górnym rogu okna Lista zdarzeń grafiki.Filtruje listę, tak aby zawiera tylko zdarzenia, które mają "Draw" w tytule.W tym scenariuszu odkrywasz, że zostało dokonanych kilka wywołań rysowania:

    Lista zdarzeń grafiki przedstawiające przechwycone zdarzenia

Po potwierdzeniu wykonywania wywołań rysowania można określić, które odpowiada brakującej geometrii.Ponieważ wiadomo, że brakująca geometria jest nie rysowana do obiektu docelowego renderowania (w tym przypadku), można użyć okna Etapy potoku grafiki, aby określić, które wywołanie rysowania odpowiada brakującej geometrii.W oknie Etapy potoku grafiki jest przedstawiona geometria wysyłana do każdego wywołania rysunku, bez względu na jej wpływ na renderowany obiekt docelowy.Gdy przechodzisz przez kolejne wywołania rysowania, etapy potoku są aktualizowane, aby wyświetlić geometrię skojarzoną z wywołaniem, a docelowy obiekt renderowania jest aktualizowany w celu pokazania jego stanu po wywołaniu.

Aby znaleźć wywołanie rysowania dla braku geometrii

  1. Otwórz okno Etapy potoku grafiki.Na pasku narzędzi programu Graphics Diagnostics wybierz przycisk Etapy potoku.

  2. Przechodź między kolejnymi wywołaniami rysowania, cały czas szukając w oknie Etapy potoku grafiki brakującego modelu.Etap Asembler danych wejściowych przedstawia surowe dane modelu.Etap Modułu cieniującego wierzchołki pokazuje dane modelu przekształconego.Etap Cieniowanie pikseli przedstawia dane wyjściowe z modułu cieniowania pikseli.Etap Scalanie danych wyjściowych przedstawia scalony obiekt docelowy renderowania tego wywołania rysunku oraz wszystkie poprzednie wywołania rysunku.

  3. Zatrzymaj po osiągnięciu wywołania rysowania odpowiadającego brakującemu modelowi.W tym scenariuszu okno Etapy potoku grafiki wskazuje, że geometria została wyrenderowana, ale nie pojawiła się w obiekcie docelowym renderowania:

    Podgląd potoku wykazujących brak obiektu

Po potwierdzeniu, że aplikacja wyrenderowała brakującą geometrię i zlokalizowaniu odpowiedniego wywołania rysowania, można wybrać część docelowego obiektu renderowania, który powinien pokazywać brakującą geometrię, a następnie użyć okna Historia pikseli grafiki, aby dowiedzieć się, dlaczego zostały wykluczone piksele.Historia pikseli zawiera listę każdego wywołania rysunku, który mógł wpłynąć na konkretny piksel.Każde wywołanie rysowania w oknie Historia pikseli grafiki jest identyfikowana przez liczbę wyświetlaną również w oknie Lista zdarzeń grafiki.Pomaga to potwierdzić, że piksel powinien wyświetlać brakującą geometrię i dowiedzieć się, dlaczego piksel został wykluczony

Aby ustalić, dlaczego został wykluczony piksel

  1. Otwórz okno Historia pikseli grafiki.Na pasku narzędzi programu Graphics Diagnostics wybierz przycisk Historia pikseli.

  2. Na podstawie miniatury Cieniowanie pikseli zaznacz piksel w obiektach wyjściowych bufora ramek, który powinien zawierać część brakującej geometrii.W tym scenariuszu produkt wyjściowy programu do cieniowania pikseli powinien obejmować większość obiektu docelowego renderowania; po wybraniu piksela okno Historia pikseli grafiki wygląda następująco:

    Okno historii pikseli przedstawiający powiązane rysować wywołań

  3. Potwierdź, że wybrany piksel obiektu docelowego renderowania zawiera część geometrii, dopasowując numer sprawdzanego wywołania rysowania (z okna Lista zdarzeń grafiki) do jednego z wywołań rysowania w oknie Historia pikseli grafiki.Jeśli żadne wywołanie w oknie Historia pikseli grafiki nie pasuje do wywołania poddawanego inspekcji, powtarzaj te kroki (z wyjątkiem kroku 1) do momentu znalezienia dopasowania.W tym scenariuszu pasujące wywołanie rysowania wygląda następująco:

    Okno historii pikseli fragment informacje o wyświetlaniu

  4. Po znalezieniu dopasowania rozwiń pasujące wywołanie rysowania w oknie Historia pikseli grafiki i potwierdź, że piksel został wyłączony.Każde wywołanie rysowania w oknie Historia pikseli grafiki odpowiada jednemu lub więcej geometrycznych elementów podstawowych (punktom, liniom lub trójkątom), które przecięły się z tym pikselem w wyniku przebiegu geometrii odnośnego obiektu.Każde takie przecięcie może przyczynić się do końcowego koloru piksela.Element podstawowy, który jest wyłączony, ponieważ nie przeszedł testu głębokości, jest reprezentowany przez ikonę pokazującą literę Z nad strzałką nachyloną w dół od lewej do prawej.

  5. Rozwiń wyłączony element podstawowy, aby dokładniej zbadać stan powodujący wyłączenie.W grupie Połączenia danych wyjściowych przesuń wskaźnik na opcję Wynik.Etykietka narzędzia wskazuje, dlaczego element podstawowy został wyłączony.W tym scenariuszu badanie ujawnia, że element podstawowy został wykluczony, ponieważ nie przeszedł testu głębokość i dlatego nie przyczynił się do końcowego koloru piksela.

Po ustaleniu, że geometria nie pojawia się, ponieważ jej element podstawowy nie przechodzi testu głębokość, możesz podejrzewać, że ten problem jest związany z niepoprawnie skonfigurowanym stanem urządzenia.Stan urządzenia i inne dane obiektów programu Direct3D mogą być zbadane za pomocą okna Tabela obiektów graficznych.

Aby sprawdzić stan urządzenia

  1. Otwórz okno Tabela obiektów graficznych.Na pasku narzędzi programu Graphics Diagnostics wybierz przycisk Tabela obiektów.

  2. Zlokalizuj obiekt Urządzenie D3D10 w oknie Tabela obiektów graficznych, a następnie otwórz obiekt Urządzenie D3D10.Nowa karta Urządzenie d3d10 zostanie otwarta w programie Visual Studio.Aby to ułatwić, posortuj tabelę obiektów graficznych według typu:

    Tabela obiektu grafiki i stan urządzenia pokrewne

  3. Przyjrzyj się stanowi urządzenia, który jest wyświetlany na karcie urządzenie d3d10, i poszukaj potencjalnych problemów.Ponieważ geometria nie pojawia się, ponieważ jej elementy podstawowe nie przeszły testu głębokości, można się skoncentrować na stanie urządzenia, na przykład wzorniku głębokości, który wpływa na test głębokości.W tym scenariuszu opis wzornika głębokość (pod polem stanu połączeń danych wyjściowych) zawiera nietypową wartość członka funkcji głębokości, D3D10_COMPARISON_GREATER:

    Okno urządzenia D3D10 wyświetlone informacje o wzornik głębokość

Po ustaleniu, że przyczyną problemu z renderowaniem może być zła konfiguracja funkcji głębokości, możesz użyć tych informacji razem ze swoją znajomością kodu i zlokalizować, gdzie funkcja głębokość została ustawiona niepoprawnie, po czym rozwiązać problem.Jeśli nie znasz kodu, można wyszukiwać problem przy użyciu wskazówek, które zebrano podczas debugowania — na przykład na podstawie opisu wzornika głębokości w tym scenariuszu może poszukać w kodzie słów takich jak „depth” (głębokość) lub „GREATER” (WIĘKSZE).Po naprawieniu kodu zrekompiluj go i uruchom aplikację ponownie, aby odkryć, że problem z renderowaniem został rozwiązany:

Aplikacja po problemu