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.


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


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.


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)


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
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.