Czym różni się tekstelFetch i tekstura OpenGL?

18

Rozumiem główne różnice między texelFetchi texture, ale mam kilka pytań dotyczących szczegółów:

  • Czy texelFetchwiąże się to z utratą wydajności? Takich jak nieużywanie pamięci podręcznej lub coś takiego?
  • Czy są texelFetchi texturewymienne podczas używania GL_NEAREST?
Martin Perry
źródło
1
Możesz napisać przypadek testowy i zobaczyć ...
ThorinII
1
Czy zapomniałeś zaznaczyć odpowiedź jako zaakceptowaną, czy jest to wciąż kwestia otwarta?
Anko

Odpowiedzi:

23

texelFetchjest zupełnie inny niż texture.

texturejest zwykłą funkcją dostępu do tekstury, która obsługuje filtrowanie i znormalizowane ( [0,1]) współrzędne tekstury. texelFetchuzyskuje bezpośredni dostęp do tekstu w teksturze (bez filtrowania) przy użyciu nienormalizowanych współrzędnych (np. (64,64)w tekstelu środkowej w teksturach 128 x 128 (.5,.5)w porównaniu ze współrzędnymi znormalizowanymi).

Sean Middleditch
źródło
4
+1 Chciałbym dodać, że texelFetch jest przeznaczony do dostępu do danych, gdy tekstura nie jest specjalnie przeznaczona do wyświetlania jako obraz, ale inny rodzaj danych, w przeciwieństwie do tekstury, która uzyskuje dostęp do tekstur, gdy mają być używane jako obrazy, dlatego używa filtrowania itp. -
concept3d
Czy jest jakaś różnica w wydajności?
Lenar Hoyt
1
@mcb: może, ale nie spodziewałbym się, że będzie bardzo duży i prawdopodobnie będzie bardzo się różnić w zależności od dostawcy sprzętu. Wydajność jest absolutnie niewłaściwą miarą, którą należy zastosować przy podejmowaniu decyzji, które z tych funkcji wywołać: użyj tej, która jest odpowiednia w danej sytuacji (albo potrzebujesz filtrowania sprzętu, a więc musisz go użyć texturelub potrzebujesz sprzętu, aby nie filtrował, a więc musisz użyć texelFetch).
Sean Middleditch
3
@SeanMiddleditch W jaki sposób wydajność jest niewłaściwa w tym przypadku? Jeśli texelFetchjest to szybsze i wystarcza filtrowanie najbliższego sąsiada, nie można zmienić kontekstu na filtrowanie NN z jakiegokolwiek powodu, uzasadnione byłoby preferowanie go texture.
Lenar Hoyt
@mcb: texelFetchi texturedziałają inaczej w fundamentalny sposób. Zobacz także dane wejściowe: współrzędne tekstury vs współrzędne znormalizowane. Służą do różnych celów. Jedno jest nie tylko optymalizacją drugiego.
Sean Middleditch,
6

Ponieważ nie ma żadnej akceptowanej odpowiedzi, dodaję trochę informacji, chciałem po prostu dodać rzeczy, które nie zostały jeszcze powiedziane przez Seana w jego odpowiedzi.

TexelFetch traktuje teksturę jak obraz, dzięki czemu można uzyskać dostęp do dokładnie zawartości pikseli. Zwykle robisz to, gdy potrzebujesz dokładnie tej treści, co jest rzadkie, ale przydatne:

  • Niektóre filtry przetwarzania końcowego (rozmycie Guassian wykorzystuje interpolację próbki tekstury, więc nie może używać TexelFetch)
  • Kiedy wierzchołki muszą czytać dane z tekstur, a jest to operacja zależna od 2 współrzędnych

Tex2D traktuje teksturę jako teksturę. Nie chcesz dokładnej zawartości piksela, ale chcesz uzyskać najbardziej realistyczny wynik. Standardowy odczyt tekstur jest bardzo złożoną operacją i obejmuje odczyt interpolowanych danych z jednego lub więcej poziomów mipmap, a następnie interpolację. Wszystkie te kosztowne operacje mają na celu uniknięcie artefaktów wizualnych.

GL_NEAREST nie będzie działał tak samo, ponieważ na najdalszych wielokątach odczytujesz dane na mniejszym poziomie mipmap, co nie jest dokładnie tymi samymi danymi, które odczytywałbyś z pobierania texel.

Jest jeden przypadek, w którym Tex2D (prawie) działa tak samo jak TexelFetch:

  1. filtr to GL_NEAREST
  2. używasz niepełnej piramidy mipmap z 1 poziomem
  3. twoje UV nie są znormalizowanymi składnikami wierzchołków (ale musisz znormalizować je w module cieniującym)
Twórca gier
źródło