Campionamento di texture direct3D molto lento


9

Quindi sto scrivendo un piccolo gioco usando Direct3D 9 e sto usando il multitexturing per il terreno. Tutto quello che sto facendo è campionare 3 trame e una mappa di fusione e ottenere il colore complessivo dalle tre trame in base ai canali di colore dalla mappa di fusione. Ad ogni modo, sto ottenendo un forte calo della frequenza dei fotogrammi quando campiono più di 1 trama, vado da 120+ fps a poco meno di 50.

Questo è il codice HLSL responsabile del rallentamento:

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

Sto sbagliando? Se qualcuno ha informazioni o suggerimenti sul campionamento delle trame o altro, sarebbe bello.

Grazie.


Che hardware hai? Quattro campioni di trama non dovrebbero essere un problema su nessun nuovo hardware.
Axel Gneiting,

Ho una Radeon X1950, sì, ha un paio d'anni, se non di più. Immagino che forse non sia l'hardware migliore. Cosa ne pensi ?
dotminic,

Risposte:


9

Se vuoi velocizzare le cose, puoi usare qualcosa chiamato atlante delle trame.

Wikipedia - Un atlante di trama è un'immagine grande, o "atlante" che contiene molte immagini secondarie più piccole, ognuna delle quali è una trama per una parte di un oggetto 3D. Le sottotrame possono essere renderizzate modificando le coordinate della trama della uvmap dell'oggetto sull'atlante, essenzialmente indicando in quale parte dell'immagine si trova la sua trama. In un'applicazione in cui molte trame piccole vengono usate frequentemente, è spesso più efficiente memorizzare le trame in un atlante di trama che viene trattato come un'unità dall'hardware grafico.

È più efficiente per una GPU campionare una singola trama di grandi dimensioni 4 volte rispetto a 4 immagini campionate una volta ciascuna. Ecco un esempio di atlante per la trama del terreno.

testo alternativo


1
Grazie per il consiglio, ho implementato il mio shader usando un atlante di trama, sto "solo" ottenendo un 109fps ora, ma è un netto miglioramento rispetto ai 55fps che stavo ottenendo. Grazie!
dotminic

1
+1 per una buona risposta. Posso chiederti dove hai ottenuto l'immagine di quell'atlante di texture? È proprietario o gratuito per qualsiasi uso?
Cameron,

4

Un'altra cosa da considerare è il formato della trama. È una trama grezza da 32 bpp? In tal caso, considera l'utilizzo di una trama DXT1 compressa, che è di 4 bit / pixel (occupando 1/8 dello spazio) o DXT5 se hai bisogno del canale alfa, a 8 bit / pixel.

La riduzione della dimensione dei dati delle trame dovrebbe comportare una riduzione dei requisiti di larghezza di banda della memoria delle trame e un miglioramento delle prestazioni della cache delle trame.

Inoltre, controlla di non aver impostato un filtro anisotropico di massima qualità, che può aggiungere un bel po 'di costi.


grazie per il consiglio, la prossima volta lo proverò.
dotminic

3

Le tue trame hanno mipmap?

Senza il mipmapping, il campionamento delle trame può essere particolarmente costoso (un sacco di errori nella cache)


Sì, le trame hanno mipmap, le ho esportate come * .dds dallo strumento texture DirectX. Ma come usano le trame nei giochi commerciali dove ci sono un sacco di trame ad alta definizione in tutto il luogo? Sto solo campionando 1 atlante di trama e ottengo un frame rate di 109 fps durante il rendering di un terreno, tutto sulla GPU.
dotminic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.