Udostępnij za pośrednictwem


Wskazówki: brak obiektów spowodowany błędnie skonfigurowanym potokiem

W tym instruktażu przedstawiono sposób użycia Visual Studio narzędzia Diagnostyka grafiki do zbadania brakujących z powodu odłączenia pixel shader obiektu.

Ten instruktaż ilustruje następujące zadania:

  • Używanie Listy zdarzeń grafiki do lokalizowania potencjalnych źródeł problemu.

  • Za pomocą Etapów rurociągu grafiki okno, aby zbadać wpływ DrawIndexed wywołanie funkcji API Direct3D.

  • Procedury kontroli kontekstu urządzenia, aby potwierdzić, nie została ustawiona na etapie modułu cieniującego.

  • Za pomocą Etapów rurociągu grafiki okno wraz z Stos wywołań zdarzenia grafiki do pomocy w znalezieniu źródła programu do cieniowania pikseli Cofnij ustawienie.

Scenariusz

Gdy brakuje obiektu w aplikacji 3-w, dlatego czasami jednego z etapów moduł cieniujący nie jest ustawiony przed obiekt.W aplikacji, które mają potrzeby renderowania proste źródłem tego błędu jest zazwyczaj znajduje się gdzieś w stos wywołań wywołanie draw tego obiektu.Jednak jako Optymalizacja, niektóre aplikacje wsadowego razem obiektów, które programy modułu cieniującego, tekstury lub inne dane wspólnego, aby zminimalizować zmianę stanu dodatkowe obciążenie.W tych aplikacji źródła błędu może być zakopany w systemie łączenia we wsady, a nie znajdujące się w stos wywołań wywołania draw.Scenariusz w tym instruktażu przedstawiono aplikacja, która ma potrzeb renderowania prosty, a więc źródła błędu znajdują się w stos wywołań.

W tym scenariuszu po uruchomieniu aplikacji było jego przetestowanie tło jest renderowane zgodnie z oczekiwaniami, ale jeden z obiektów nie jest wyświetlany.Przy użyciu programu Graphics Diagnostics można przechwytywać problemy do dziennika grafiki, dzięki czemu można debugować aplikację.Problem w aplikacji wygląda następująco:

Obiekt nie są widoczne.

Dochodzenie

Za pomocą narzędzia Diagnostyka grafiki, można załadować dokumentu dziennika grafiki do wglądu ramek, które zostały przechwycone podczas badania.

Aby sprawdzić ramkę w dzienniku grafiki

  1. W Visual Studio, załadować dokument dziennika grafiki, który zawiera ramkę, która wykazuje brakującego obiektu.Nowa karta Dziennik grafiki 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 obiekt nie jest wyświetlany.Obiekt docelowy renderowania został zaktualizowany, aby odzwierciedlić wybraną ramkę.W tym scenariuszu karta dziennika grafiki wygląda następująco:

    Grafika dokumentu dziennika w programie Visual Studio

Po zaznaczeniu ramki, która przedstawia problem, możesz zacząć rozpoznać go za pomocą Listę zdarzeń grafiki.Listę zdarzeń grafiki zawiera każdego wywołania Direct3D API, będącego odbiorcą renderowanie aktywnej ramki — na przykład, aby skonfigurować stan urządzenia, aby tworzenie i aktualizowanie buforów i rysować obiekty, które pojawiają się w ramce.Wiele rodzajów połączeń — na przykład, remis, wysyłki, kopiowania lub wyraźne połączenia — są interesujące, ponieważ często (ale nie zawsze) odpowiadającej im zmiany stanu obiektu docelowego renderowania, gdy aplikacja działa zgodnie z oczekiwaniami.Wywołania Draw są szczególnie interesujące, ponieważ każdy z nich reprezentuje geometrii, które z założenia aplikacja.

Ponieważ wiadomo, że nie zawiera obiektu docelowego renderowania brakujący obiektu, lecz także że wydają się inne błędy, można użyć Listę zdarzeń grafiki wraz z Etapów rurociągu grafiki brakuje obiektu, który odpowiada narzędzia, aby sprawdzić, który opracowuje wywołanie.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.Podczas przeglądania przez wywołania remis, etapy potoku są aktualizowane, aby pokazać dane geometryczne, które ma skojarzone z każdym połączeniu, jako przepływa przez każdy z etapów włączonych, a docelowy format wyjściowy renderowania jest aktualizowana w celu wyświetlenia stanu obiektu docelowego renderowania, po zakończeniu połączenia.

Aby znaleźć wywołanie rysowania dla braku geometrii

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

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

  3. Przechodząc przez kolejne wywołania rysowania w oknie Lista zdarzeń grafiki, w oknie Etapy potoku grafiki szukaj brakującego obiektu.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 Etapów rurociągu grafiki okna, Wprowadzania asembler , widowiska obiektu, który przed jest przekształcane i Programu do cieniowania wierzchołków etapu zawiera ten sam obiekt po jest przekształcane.W tym scenariuszu warto zauważyć, że Etapów rurociągu grafiki pokazuje okno Wprowadzania asembler i Programu do cieniowania wierzchołków etapach, ale nie Programu do cieniowania pikseli etapie w odniesieniu do jednego z połączeń remisu.

    [!UWAGA]

    Jeśli inne RUROCIĄgOWY etapów — na przykład, moduł cieniujący kadłuba, moduł cieniujący domeny lub etapów modułu cieniującego geometrii — przetworzyć obiektu, żadnego z nich może być przyczyną problemu.Zazwyczaj problem dotyczy najwcześniejszego etapu, w którym wynik nie jest wyświetlany lub jest wyświetlany w nieoczekiwany sposób.

  4. Zatrzymaj po osiągnięciu wywołania rysowania odpowiadającego brakującemu obiektowi.W tym scenariuszu Etapów rurociągu grafiki okno wskazuje, że do procesora GPU wystosowano geometrii (wskazanych przez obecność Asembler wprowadzania etapu) i przekształcony (wskazanych przez Programu do cieniowania wierzchołków etapu), ale nie pojawia się w obiektu docelowego renderowania, ponieważ nie wydaje się być programu do cieniowania pikseli active (wskazanych przez brak Pixel Shader etapu).W tym scenariuszu można nawet zobaczyć maskującego brakującego obiektu w Połączenia danych wyjściowych etapu:

    Zdarzenie DrawIndexed i jego wpływu na potoku

Po potwierdzić, że aplikacja ogłosiła zaproszenie draw geometrii brakującego obiektu i Odkryj, że na etapie programu do cieniowania pikseli była nieaktywna, można sprawdzić stan urządzenia, aby potwierdzić wyniki swoich badań.Można użyć Tabeli obiektów graficznych zbadanie kontekstu urządzenia i inne dane obiektu Direct3D.

Zbadanie kontekstu urządzenia

  1. Otwórz kontekstu urządzenia d3d11.W Etapów rurociągu grafiki okno, wybierz polecenie ID3D11DeviceContext łącze, które jest częścią DrawIndexed połączenia, który jest wyświetlany w górnej części okna.

  2. Bada stan urządzenia, który jest wyświetlany w kontekstu urządzenia d3d11 kartę, aby potwierdzić, że nie programu do cieniowania pikseli był aktywny podczas wywołania draw.W tym scenariuszu modułu cieniującego ogólne informacje— wyświetlany w obszarze pixel shader Państwo— wskazuje, że moduł cieniujący jest NULL:

    Kontekst urządzenia D3D 11 pokazuje stan cieniowania pikseli

Po potwierdzeniu, że programu do cieniowania pikseli była ustawiona na null przez aplikację, następnym krokiem jest aby znaleźć lokalizację w kodzie źródłowym danej aplikacji których ustawiono modułu cieniującego.Można użyć Listę zdarzeń grafiki wraz z Stos wywołań zdarzenia grafiki Aby znaleźć tej lokalizacji.

Aby dowiedzieć się, gdzie programu do cieniowania pikseli jest ustawiony w kodzie źródłowym danej aplikacji

  1. Znajdź PSSetShader połączenia, który odpowiada brakującego obiektu.W Listę zdarzeń grafiki okna, wprowadź "Rysowanie;PSSetShader"w Szukaj polu w prawym górnym rogu Listę zdarzeń grafiki okna.Filtruje listę, tak aby zawierała tylko zdarzenia "PSSetShader" i zdarzenia, które mają "Rysuj" w swoim tytule.Wybrać pierwszy PSSetShader wywołanie, które pojawia się przed wywołaniem draw brakuje obiektu.

    [!UWAGA]

    PSSetShadernie pojawi się w Listę zdarzeń grafiki okna, jeśli nie została ustawiona podczas tej ramki.Zazwyczaj dzieje się tak tylko wtedy, gdy tylko jeden piksel jest używany dla wszystkich obiektów lub jeśli PSSetShader wywołanie nieumyślnie zostało pominięte podczas tej ramki.W obu przypadkach firma Microsoft zaleca, wyszukiwania kodu źródłowego aplikacji dla PSSetShader połączeń i wykorzystania tradycyjnych technik debugowania w celu badania zachowanie te wywołania.

  2. Otwórz okno Stos wywołań zdarzeń grafiki.Na pasku narzędzi programu Graphics Diagnostics wybierz przycisk Stos wywołań zdarzeń grafiki.

  3. Zlokalizuj za pomocą stosu wywołań PSSetShader wywoływać w kodzie źródłowym danej aplikacji.W Stos wywołań zdarzenia grafiki okno, wybierz wywołanie górze i zbadać wartość, która jest wartość programu do cieniowania pikseli.Programu do cieniowania pikseli może być ustawiony bezpośrednio na wartości null lub wartości null wartość może wystąpić z powodu argument, który został przekazany do funkcji lub innego Państwa.Jeśli nie jest bezpośrednio zestaw, można zlokalizować źródła wartości null gdzieś w górę stosu wywołań.W tym scenariuszu odkryjesz, że programu do cieniowania pikseli jest ustawiany bezpośrednio do nullptr w górze funkcji, która nosi nazwę CubeRenderer::Render:

    Kod, który nie zainicjowania programu do cieniowania pikseli

    [!UWAGA]

    Jeśli nie możesz zlokalizować źródło wartość null tylko na podstawie stosu wywołań, zaleca się nadanie warunkowego punkt przerwania na PSSetShader połączenia, takie, że wykonywanie programu przerwy podczas programu do cieniowania pikseli zostanie ustawiona na wartość null.Następnie ponownie uruchomić aplikacji w trybie debugowania i zlokalizować jego Yródło wartość null przy użyciu tradycyjnych technik debugowania.

Aby rozwiązać ten problem, należy przypisać programu do cieniowania pikseli poprawne za pomocą pierwszy parametr ID3D11DeviceContext::PSSetShader funkcji API.

Skorygowany kodu źródłowego języka C++

Czy po rozwiązaniu kod, można zbudować go ponownie i uruchomić aplikację ponownie, aby sprawdzić, czy problem renderowania został rozwiązany:

Obiekt jest teraz wyświetlany.