Ile tekstur zazwyczaj mogę wiązać jednocześnie?


23

Tworzę silnik gry, który będzie działał tylko na nowoczesnym sprzęcie (Shader model 4+). Wydaje mi się, że zanim skończę, nie będzie to tak nieracjonalnym wymogiem.

Moje pytanie brzmi: ile tekstur mogę oprawić jednocześnie na nowoczesnej karcie graficznej? 16 byłoby wystarczające. Czy mogę oczekiwać, że większość nowoczesnych kart graficznych będzie obsługiwać taką liczbę tekstur?

Mój GTX 460 wydaje się obsługiwać 32, ale nie mam pojęcia, czy jest to reprezentatywne dla większości nowoczesnych kart graficznych.


Jakiego interfejsu API renderowania używasz?
Adam

2
OpenGL oczywiście :)
Avi

Odpowiedzi:


53

Liczba tekstur, które można powiązać z OpenGL, nie wynosi 32 lub 16 . To nie jest to, co dostajesz glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Ta funkcja pobiera liczbę tekstur, które mogą być dostępne przez moduł cieniujący fragmenty .

Zobacz, każdy moduł cieniujący ma swój własny limit liczby tekstur, których może użyć . Jednak istnieje również całkowita liczba tekstur, których można użyć, kropka. Jest to zdefiniowane (w OpenGL) przez GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Istnieją więc dwa ograniczenia: tekstury na etap i tekstury całkowicie powiązane.

OpenGL 3.x określa minimalną liczbę limitów na etap wynoszącą 16, więc sprzęt nie może mieć mniej niż 16 tekstur na etap. Może mieć wyższy limit, ale wiesz, że otrzymujesz co najmniej 16. 3.x określa minimalną liczbę dla tekstur związanych łącznie na 48. AKA: 16 * 3 etapy. Podobnie, GL 4.x definiuje liczby jako 16 tekstur na etap i 96 tekstur łącznie (tj. 16 * 6 etapów, włączając shadery obliczeniowe).

Ponownie, są to liczby minimalne . Sprzęt może (i robi) się różnić.

Jeśli chodzi o konkretny sprzęt, można oczekiwać, że dowolny sprzęt klasy DX10 będzie pasował do tych liczb. Sprzęt klasy DX11 ma pewną wariancję; Układy NVIDIA (GeForce 4xx +) i wyższej klasy układy AMD (aka: rdzenie GCN) mogą mieć więcej niż 16 na stopień.


2
Chciałbym, żeby to była zaakceptowana odpowiedź. Oszczędziłoby mi to 5 minut bezcelowego czytania.
Fibbles

3

Uważam, że 32 to maksymalna liczba tekstur, które można obecnie związać. O ile wiem, nawet seria 8800 miała 32 jednostki tekstur.

O ile mi wiadomo, do obsługi OpenGL 4.x potrzebna będzie karta Fermi lub nowsza karta NVIDIA (lub odpowiednia karta AMD), wszystkie modele z wyższej półki wydają się mieć 32 jednostki, podczas gdy karty z najniższej klasy (na przykład GT 430) ) mają 16. Jednak patrząc na arkusze specyfikacji AMD, wyświetlają numery takie jak 80 lub 128 jednostek tekstur, ale wymieniają 32 jednostki ROP w kolorze, które wydają się pozostawać niezmienne przez pokolenia.

Z drugiej strony GTX 480 ma 60 jednostek tekstur i 48 jednostek ROP, podczas gdy karty z niższej półki, takie jak 430, mają podobno tylko 16 jednostek tekstur i 4 jednostki ROP. Ogólnie rzecz biorąc, nie jestem do końca przekonany, czy którykolwiek z nich jest liczbą, której tak naprawdę szukasz.

Możesz jednak sprawdzić liczbę jednostek tekstur dostępnych do renderowania potoków funkcji nie ustalonych za pomocą glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);, więc jeśli masz dostęp do różnorodnego sprzętu, możesz to sprawdzić.

EDYCJA: ta strona pozwala porównać zgłaszane możliwości openGL wszystkich rodzajów kart wideo, które powinny dać ci potrzebne liczby: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PS: AMD i nvidia niedawno wprowadziły „bezbłędne tekstury” (amd ma na to inną nazwę), która pozwala na używanie dużej liczby tekstur bez wiązania ich z jednostkami tekstowymi, w tej chwili jest to dostępne tylko w openGL.


1
Następnie prawdziwa odpowiedź brzmi: „masz tyle, ile może zaoferować sprzęt”. Lub inaczej mówiąc, wszystko powinno działać tak szybko, jak to możliwe. (oraz w OpenGL, który obejmuje prawie każde pole).
Darkwings,

@Darkwings Podejrzewam, że wiązanie większej liczby tekstur, niż sprzęt może obsłużyć, zwykle prowadzi do błędu lub przekroczenia limitu czasu sterownika. Również źle odczytałem, powiedział, że model cieniujący 4+ nie jest opengl 4+. Patrząc na pierwsze karty DX10 (rodziny kart X2900 i 8800) wszystkie wydają się mieć co najmniej 16 jednostek tekstur.

Właśnie podkreślałem fakt, że skoro można go sparametryzować, tak powinno być. Nawet jeśli gra ma się czołgać na starszych kartach, nie powinna być czymś zakodowanym na stałe, ale „sugerowanym wymogiem”.
Darkwings,

4
-1: Ta odpowiedź jest błędna. Zobacz moją odpowiedź, dlaczego (to jest zbyt długie, aby wyjaśnić tutaj).
Nicol Bolas,

1
Co może nie być od razu oczywiste. Prawie nikt nie korzysta z GL_TEXTURE n GLenums; zamiast tego użyj GL_TEXTURE0 + n, gdzie n jest miejscem do wiązania. GLenum mają tylko 32 gniazda, ale to nie znaczy, że OpenGL ogranicza Cię do 32. Specyfikacja gwarantuje, że będą sekwencyjne. Ponadto, jeśli nie korzystasz z DSA, możesz zarezerwować miejsce na powiązanie do utworzenia / modyfikacji, aby stan używany do tworzenia / modyfikacji miał mniej interakcji ze stanem używanym do rysowania.
Maximus Minimus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.