Bardzo wolne próbkowanie tekstury Direct3D

9

Piszę więc małą grę za pomocą Direct3D 9 i używam multiteksturowania w terenie. Wszystko, co robię, to próbkowanie 3 tekstur i mapy mieszania oraz uzyskiwanie ogólnego koloru z trzech tekstur w oparciu o kanały kolorów z mapy mieszania. W każdym razie, gdy próbuję więcej niż 1 tekstury, uzyskuję ogromny spadek liczby klatek, przechodzę z 120+ fps do nieco poniżej 50.

Oto kod HLSL odpowiedzialny za spowolnienie:

float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone  = tex2D(StoneTex, multiTex).rgb;
float3 grass  = tex2D(GrassTex, multiTex).rgb;
float3 blend  = tex2D(BlendMapTex, blendMap).rgb;

Czy robię to źle? Jeśli ktoś ma jakieś informacje lub porady dotyczące próbkowania tekstur lub coś w tym stylu, byłoby miło.

Dzięki.

dotminic
źródło
Jaki masz sprzęt? Cztery próbki tekstur nie powinny stanowić problemu na żadnym nowym sprzęcie.
Axel Gneiting
Mam Radeona X1950, tak, ma kilka lat, jeśli nie więcej. Chyba nie jest to najlepszy sprzęt. Co myślisz ?
dotminic

Odpowiedzi:

9

Jeśli chcesz przyspieszyć, możesz użyć atlasu tekstur.

Wikipedia - atlas tekstur to duży obraz lub „atlas” zawierający wiele mniejszych podobrazów, z których każdy jest teksturą dla pewnej części obiektu 3D. Podtekstury można renderować, modyfikując współrzędne tekstury uvmapy obiektu w atlasie, mówiąc zasadniczo, w której części obrazu znajduje się jego tekstura. W aplikacji, w której często używa się wielu małych tekstur, często bardziej efektywne jest przechowuj tekstury w atlasie tekstur, który jest traktowany jako jednostka przez sprzęt graficzny.

Bardziej wydajne jest, aby procesor GPU próbkował jedną dużą teksturę 4 razy w porównaniu z 4 obrazami próbkowanymi raz. Oto przykład atlasu tekstury terenu.

alternatywny tekst

zfedoran
źródło
1
Dzięki za radę, zaimplementowałem mój moduł cieniujący za pomocą atlasu tekstur, „dostaję” teraz tylko 109 klatek na sekundę, ale jest to doskonała poprawa w stosunku do 55 klatek na sekundę, którą otrzymywałem. Dzięki!
dotminic
1
+1 za dobrą odpowiedź. Czy mogę zapytać, skąd masz ten obraz atlasu tekstur? Czy jest zastrzeżony czy bezpłatny do jakiegokolwiek użytku?
Cameron,
4

Inną rzeczą do rozważenia jest format tekstury. Czy to jest surowa tekstura 32bpp? Jeśli tak, rozważ użycie skompresowanej tekstury DXT1, która wynosi 4 bity / piksel (zajmuje 1/8 miejsca), lub DXT5, jeśli potrzebujesz kanału alfa, o 8 bitach / piksel.

Zmniejszenie rozmiaru danych tekstur powinno skutkować zmniejszeniem wymagań dotyczących przepustowości pamięci tekstur i poprawą wydajności pamięci podręcznej tekstur.

Sprawdź również, czy nie ustawiono filtrowania anizotropowego o maksymalnej jakości - to może znacznie zwiększyć koszty.

bluescrn
źródło
dzięki za radę, spróbuję następnym razem.
dotminic
3

Czy twoje tekstury mają mipmapy?

Bez mipmapowania próbkowanie tekstur może być szczególnie kosztowne (mnóstwo braków pamięci podręcznej)

bluescrn
źródło
Tak, tekstury mają mipmapy, wyeksportowałem je jako * .dds z narzędzia tekstur DirectX. Ale w jaki sposób używają tekstur w grach komercyjnych, w których wszędzie jest mnóstwo tekstur o wysokiej rozdzielczości? Próbuję tylko 1 atlasu tekstur i uzyskuję szybkość klatek 109 fps podczas renderowania terenu, wszystko na GPU.
dotminic