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.
Odpowiedzi:
Jeśli chcesz przyspieszyć, możesz użyć atlasu tekstur.
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.
źródło
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.
źródło
Czy twoje tekstury mają mipmapy?
Bez mipmapowania próbkowanie tekstur może być szczególnie kosztowne (mnóstwo braków pamięci podręcznej)
źródło