Condividi tramite


Ottimizzazione degli shader HLSL

Questa sezione descrive le strategie per utilizzo generico che è possibile usare per ottimizzare gli shader. È possibile applicare queste strategie agli shader scritti in qualsiasi linguaggio, in qualsiasi piattaforma.

Come determinare dove eseguire i calcoli shader

Il vertex shader esegue operazioni che includono il recupero dei vertici e l'esecuzione della trasformazione tramite matrice dei dati dei vertici. In genere, i vertex shader vengono eseguiti una volta per vertice.

I pixel shader eseguono operazioni che includono il recupero dei dati delle trame e l'esecuzione di calcoli di illuminazione. In genere, i pixel shader vengono eseguiti una volta per ciascun pixel di una determinata parte di geometria.

In genere, i pixel sono più numerosi dei vertici in una scena, quindi gli shader dei pixel vengono eseguiti più spesso rispetto agli shader dei vertici.

Quando si progettano algoritmi shader, tenere presente quanto segue:

  • Eseguire calcoli sul vertex shader, se possibile. Un calcolo eseguito su un pixel shader è molto più costoso di un calcolo eseguito su un vertex shader.
  • Prendere in considerazione l'uso di calcoli per vertice per migliorare le prestazioni in situazioni come quelle di mesh dense. Per le mesh dense, i calcoli per vertice possono produrre risultati visivamente indistinguabili dai risultati prodotti con calcoli per pixel.

Ignorare le istruzioni non necessarie

In HLSL, la diramazione dinamica consente di limitare il numero di istruzioni eseguite. Di conseguenza, la diramazione dinamica consente di velocizzare l'esecuzione dello shader. Se la geometria o i pixel non vengono visualizzati, usare la diramazione dinamica per uscire dallo shader o per limitare le istruzioni. Ad esempio, se un pixel non è acceso, non c'è alcun punto nell'esecuzione dell'algoritmo di illuminazione.

La tabella seguente elenca alcuni casi in cui è possibile testare le condizioni nello shader e usare la diramazione dinamica per ignorare le istruzioni non necessarie. Tabella non completa. Piuttosto, è progettato per offrire idee per ottimizzare il codice.

Condizione da controllare Risposta nello shader
Il controllo alfa determina che un pixel non verrà visualizzato. Ignorare il resto dello shader.
Il pixel o la geometria sono completamente annebbiati. Ignorare il resto dello shader.
I pesi della pelle sono zero. Saltare le ossa.
L'attenuazione della luce è zero. Ignorare l'illuminazione.
Termine lambertiano non positivo. Ignorare l'illuminazione.

 

Comprimere variabili e interpolanti

Tenere presente lo spazio necessario per i dati dello shader. Comprimere la maggior quantità possibile di informazioni in una variabile o in un interpolante. In alcuni casi, le informazioni di due variabili possono essere compresse nello spazio di memoria di una singola variabile.

Ridurre la complessità dello shader

Mantieni gli shader piccoli e semplici. In generale, gli shader con un minor numero di istruzioni vengono eseguiti più rapidamente rispetto agli shader con più istruzioni. È anche più facile eseguire il debug e ottimizzare shader più piccoli e meno complessi.

Guida per la programmazione HLSL

Guida alla programmazione per HLSL