Udostępnij za pośrednictwem


Wskazówki: debugowanie błędów renderowania spowodowanych cieniowaniem

W tym instruktażu przedstawiono sposób użycia programu Visual Studio Graphics Diagnostics do zbadania obiektu, który jest niepoprawnie pokolorowany z powodu błędu programu do cieniowania.

W tym instruktażu przedstawiono sposób:

  • Zbadaj dokument dziennika grafiki, aby zidentyfikować piksele, które pokazują problem.

  • Użyj okna Historia pikseli grafiki, aby dokładniej zbadać stan pikseli.

  • Użyj debugera języka HLSL do zbadania cieniowania pikseli i wierzchołków.

Scenariusz

Niepoprawne kolorowanie obiektów często występuje, gdy program do cieniowania wierzchołków przekazuje programowi do cieniowania pikseli nieprawidłowe lub niekompletne informacje.

W tym scenariuszu ostatnio dodano obiekt do aplikacji, razem z nowymi cieniowaniami wierzchołków i pikseli, w celu przekształcenia obiektu i nadania mu unikatowego wyglądu.Po uruchomieniu aplikacji podczas testu obiekt jest renderowany w czerni.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 jest renderowany z nieprawidłowych kolorów.

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 programie Visual Studio załaduj dziennik grafiki zawierający ramkę, która wykazuje brak modelu.Nowe okno dokumentu dziennika grafiki pojawia się w Visual Studio.W górnej części tego okna jest render docelowy format wyjściowy zaznaczonej ramki.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ę, w której obiekt nie ma prawidłowego wyglądu.Obiekt docelowy renderowania został zaktualizowany, aby odzwierciedlić wybraną ramkę.W tym scenariuszu grafika dziennika dokumentu okno wygląda tak:

    Grafika dokumentu zalogować się w programie Visual Studio.

Po zaznaczeniu klatki, która demonstruje problem, można użyć okna Historia pikseli grafiki do zdiagnozowania go.W oknie Historia pikseli grafiki znajdują się proste kształty, które mogły wpłynąć na określony piksel, ich cieniowanie oraz informacje, jakie wystąpiły efekty renderowanego obiektu docelowego, w porządku chronologicznym.

Aby sprawdzić piksel

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

  2. Wybierz piksel do sprawdzenia.W oknie dokumentu dziennika grafiki wybierz jedną z pikseli na obiekt, który jest niepoprawnie koloru:

    Wybieranie piksel Wyświetla informacje o jego historii.

    Okno Historia pikseli grafiki jest aktualizowane w celu odzwierciedlenia wybranego piksela.W tym scenariuszu okno Historia pikseli grafiki wygląda następująco:

    Historia pikseli zawiera jedno zdarzenie DrawIndexed.

    Należy zauważyć, że wynikiem programu do cieniowania pikseli jest całkowicie nieprzezroczysty czarny (0, 0, 0, 1), a funkcja Połączenia danych wyjściowych połączyła ją z kolorem Poprzedni piksela w taki sposób, że obiekt Wynik jest również całkowicie nieprzezroczysty czarny.

Po zbadaniu piksela, który jest niepoprawnie kolorowany, i stwierdzeniu, że produkt wyjściowy programu do cieniowania pikseli nie ma oczekiwanego koloru, możesz użyć debugera języka HLSL do zbadania programu do cieniowania pikseli i sprawdzenia, co się stało z kolorem obiektu.HLSL Debugger może być użyty do sprawdzenia stanu zmiennych HLSL podczas wykonywania, przejścia przez kod HLSL i ustalenia punktów przerwania w celu zdiagnozowania problemu.

Aby sprawdzić cieniowanie pikseli

  1. Rozpocznij debugowanie modułu cieniującego pikseli.W oknie Historia pikseli grafiki pod elementem podstawowym obiektu obok nagłówka Cieniowanie pikseli wybierz przycisk Rozpocznij debugowanie.

  2. W tym scenariuszu, ponieważ program do cieniowania pikseli tylko przekazuje kolor z programu do cieniowania wierzchołków, jest łatwo zaobserwować, że program do cieniowania pikseli nie jest źródłem problemu.

  3. Umieść wskaźnik na elemencie input.color.Należy zauważyć, że jego wartość jest całkowicie nieprzezroczysty czarny (0, 0, 0, 1).

    Element "kolor" "wejścia" jest czarnym.

    W tym scenariuszu badanie ujawnia, że niepoprawny kolor jest prawdopodobnie wynikiem cieniowania wierzchołków, które nie oferuje informacje właściwy kolor cieniowania pikseli do pracy na.

Po ustaleniu, że programu do cieniowania wierzchołków prawdopodobnie nie zapewnia odpowiednich informacji do programu do cieniowania pikseli, następnym krokiem jest zbadanie programu do cieniowania wierzchołków.

Aby sprawdzić cieniowanie wierzchołków

  1. Rozpocznij debugowanie modułu cieniującego wierzchołka.W oknie Historia pikseli grafiki pod elementem podstawowym obiektu obok nagłówka Cieniowanie wierzchołków wybierz przycisk Rozpocznij debugowanie.

  2. Zlokalizuj strukturę wyjściową cieniowania wierzchołków — są to dane wejściowe dla cieniowania pikseli.W tym scenariuszu nazwą struktury jest output.Sprawdzić kod programu do cieniowania wierzchołków i zwróć uwagę, że color członkiem output struktury została jawnie ustawiona na całkowicie nieprzezroczysty czarny, być może w rezultacie ktoś jest debugowanie wysiłków.

  3. Potwierdź Członkowskie kolorów nie jest kopiowana z wejściowego struktury.Ponieważ wartość output.color jest ustawiona na całkowicie nieprzezroczysty czarny tuż przed output struktury jest zwracany, to dobry pomysł, aby upewnić się, że wartość output nie został poprawnie zainicjowany w poprzednim wierszu.Kod programu do cieniowania wierzchołków aż do linii, która ustawia krok po kroku output.color na kolor czarny, podczas oglądania wartość output.color.Należy zauważyć, że wartość output.color nie jest inicjowany, dopóki jest ustawiona na kolor czarny.Jest to potwierdzenie, że wiersza kodu, który ustawia output.color do black powinny być zmodyfikowane, a nie usunięte.

    Wartość "output.color" jest czarnym.

Po ustaleniu, że przyczyną problemu renderowania jest, że programu do cieniowania wierzchołków nie dostarcza wartości kolorów do programu do cieniowania pikseli, można użyć tych informacji, aby je rozwiązać.W tym scenariuszu można poprawić zmieniając poniższy kod w programu do cieniowania wierzchołków

output.color = float3(0.0f, 0.0f, 0.0f);

Aby

output.color = input.color;

Ten kod przekazuje tylko kolor wierzchołka z niezmodyfikowanych wierzchołków obiektu — bardziej złożone programy do cieniowania wierzchołków mogą modyfikować kolor przed przekazaniem go dalej.Skorygowany kod modułu cieniującego powinien być podobny do następującego:

Kod cieniowania wierzchołków skorygowany.

Po naprawieniu kodu zrekompiluj go i uruchom aplikację ponownie, aby odkryć, że problem z renderowaniem został rozwiązany.

Obiekt jest renderowany przy użyciu prawidłowego kolorów.