Udostępnij przez


Optymalizowanie shaderów HLSL

W tej sekcji opisano strategie ogólnego przeznaczenia, których można użyć do optymalizacji cieniowania. Możesz zastosować te strategie do shaderów napisanych w dowolnym języku, na dowolnej platformie.

Dowiedz się, gdzie wykonywać obliczenia cieniowania

Shaderzy wierzchołków wykonują operacje obejmujące pobieranie wierzchołków i wykonywanie transformacji macierzy danych o wierzchołkach. Zazwyczaj cieniowania wierzchołków są wykonywane raz na wierzchołek.

Cieniowniki pikseli wykonują operacje, które obejmują pobieranie danych tekstury i wykonywanie obliczeń oświetlenia. Zazwyczaj cieniowania pikseli są wykonywane raz na piksel dla danego fragmentu geometrii.

Zazwyczaj piksele przewyższają wierzchołki w scenie, więc cieniowania pikseli są wykonywane częściej niż cieniowania wierzchołków.

Podczas projektowania algorytmów cieniowania należy pamiętać o następujących kwestiach:

  • Jeśli to możliwe, wykonaj obliczenia na shaderze wierzchołków. Obliczenie wykonywane na shaderze pikseli jest znacznie bardziej kosztowne niż obliczenie wykonywane na shaderze wierzchołków.
  • Rozważ użycie obliczeń na poziomie wierzchołków w celu zwiększenia wydajności w sytuacjach, takich jak gęste siatki. W przypadku gęstych siatek obliczenia na wierzchołki mogą generować wyniki, które są wizualnie nie do odróżnienia od wyników generowanych za pomocą obliczeń na piksel.

Pomiń niepotrzebne instrukcje

W systemie HLSL dynamiczne rozgałęzianie umożliwia ograniczenie liczby wykonywanych instrukcji. W związku z tym dynamiczne rozgałęzianie może pomóc przyspieszyć czas wykonywania cieniowania. Jeśli geometria lub piksele nie są wyświetlane, użyj dynamicznego rozgałęziania, aby zakończyć cieniowanie lub ograniczyć instrukcje. Jeśli na przykład piksel nie jest oświetlony, nie ma sensu wykonywać algorytmu oświetlenia.

W poniższej tabeli wymieniono niektóre przypadki, w których można przetestować warunki w cieniowaniu i użyć dynamicznego rozgałęziania, aby pominąć niepotrzebne instrukcje. Tabela nie jest kompleksowa. Zamiast tego ma ona na celu przekazanie pomysłów na optymalizację kodu.

Warunek do sprawdzenia Odpowiedź w shaderze
Sprawdzanie alfa określa, że piksel nie będzie widoczny. Pomiń resztę cieniowania.
Piksele lub geometria są całkowicie zamglone. Pomiń resztę cieniowania.
Wagi skóry są zerowe. Pomiń kości.
Zatłoczenie światła jest zerowe. Pomiń oświetlenie.
Niepozytywny termin Lambertowski. Pomiń oświetlenie.

 

Pakowanie zmiennych i interpolantów

Należy pamiętać o przestrzeni wymaganej dla danych cieniowania. Spakuj jak najwięcej informacji do zmiennej lub interpolanta. Czasami informacje z dwóch zmiennych mogą być pakowane w przestrzeń pamięci pojedynczej zmiennej.

Zmniejsz złożoność cieniowania

Zachowaj cieniowania małe i proste. Ogólnie rzecz biorąc, cieniowania z mniejszą liczbą instrukcji są wykonywane szybciej niż cieniowania z większą liczbą instrukcji. Również łatwiej jest debugować i optymalizować mniejsze, mniej złożone shadery.

Przewodnik programowania dla HLSL

Przewodnik programowania dla HLSL