Share via


Uso di shader in Direct3D 9

Compilazione di un shader per hardware specifico

Gli shader sono stati aggiunti prima a Microsoft DirectX in DirectX 8.0. In quel momento, sono state definite diverse macchine virtuali shader, ognuna approssimativamente corrispondente a un determinato processore grafico prodotto dai principali fornitori di grafica 3D. Per ognuna di queste macchine virtuali shader, è stato progettato un linguaggio di assembly. I programmi scritti nei modelli shader (nomi vs_1_1 e ps_1_1 - ps_1_4) erano relativamente brevi e sono stati generalmente scritti dagli sviluppatori direttamente nel linguaggio di assembly appropriato. L'applicazione passerebbe il codice del linguaggio dell'assembly leggibile alla libreria D3DX usando D3DXAssembleShader e recupera una rappresentazione binaria dello shader che a sua volta verrà passata usando CreateVertexShader o CreatePixelShader. Per altre informazioni, vedere il kit di sviluppo software (SDK).

La situazione in Direct3D 9 è simile. Un'applicazione passa un shader HLSL a D3DX usando D3DXCompileShader e recupera una rappresentazione binaria del shader compilato che a sua volta viene passato a Microsoft Direct3D usando CreatePixelShader o CreateVertexShader. Il runtime non conosce nulla su HLSL, solo i modelli di assembly binari shader. Questo è bello perché significa che il compilatore HLSL può essere aggiornato indipendentemente dal runtime Direct3D. È anche possibile compilare shader offline usando fxc.

Oltre allo sviluppo del compilatore HLSL, Direct3D 9 ha introdotto anche i modelli shader a livello di assembly per esporre la funzionalità dell'hardware grafico di ultima generazione. Gli sviluppatori di applicazioni possono lavorare nell'assembly per questi nuovi modelli (vs_2_0, vs_3_0, ps_2_0, ps_3_0) ma ci aspettiamo che la maggior parte degli sviluppatori passi a HLSL per lo sviluppo di shader.

Naturalmente, la possibilità di scrivere un programma HLSL per esprimere un particolare algoritmo di ombreggiatura non consente automaticamente l'esecuzione in qualsiasi hardware specifico. Un'applicazione chiama D3DX per compilare uno shader nel codice dell'assembly binario con D3DXCompileShader. Una delle limitazioni con questo punto di ingresso è un parametro che definisce quale dei modelli a livello di assembly (o destinazioni di compilazione) il compilatore HLSL deve usare per esprimere il codice dello shader finale. Se un'applicazione esegue la compilazione dello shader HLSL in fase di esecuzione (anziché compilare tempo o offline), l'applicazione potrebbe esaminare le funzionalità del dispositivo Direct3D e selezionare la destinazione di compilazione in modo che corrisponda. Se l'algoritmo espresso nello shader HLSL è troppo complesso da eseguire nella destinazione di compilazione selezionata, la compilazione avrà esito negativo. Ciò significa che, mentre HLSL è un vantaggio enorme per lo sviluppo di shader, non libera sviluppatori dalle realtà dei giochi di spedizione a un pubblico di destinazione con dispositivi grafici di diverse funzionalità. Come sviluppatore di giochi, devi comunque gestire un approccio a livelli agli oggetti visivi; questo significa scrivere shader migliori per schede grafiche più capaci e scrivere versioni più di base per le schede precedenti. Con HLSL ben scritto, tuttavia, questo carico può essere facilitato in modo significativo.

Anziché compilare gli shader HLSL usando D3DX nel computer del cliente in fase di caricamento dell'applicazione o al primo uso, molti sviluppatori scelgono di compilare lo shader da HLSL al codice dell'assembly binario prima della spedizione. Ciò mantiene il codice sorgente HLSL lontano dagli occhi prying e garantisce anche che tutti gli shader che l'applicazione verrà mai eseguita attraverso il processo di garanzia della qualità interna. Un'utilità utile per la compilazione di shader offline è fxc. Questo strumento include diverse opzioni che è possibile usare per compilare il codice per la destinazione di compilazione specificata. Studiare l'output smontato può essere molto educativo durante lo sviluppo se si vuole ottimizzare gli shader o in genere conoscere le funzionalità della macchina virtuale shader a un livello più dettagliato. Queste opzioni sono riepilogate di seguito:

Inizializzazione delle costanti shader

Le costanti shader sono contenute nella tabella costante. È possibile accedervi con l'interfaccia ID3DXConstantTable . Le variabili di shader globali possono essere inizializzate nel codice shader. Vengono inizializzati in fase di esecuzione chiamando SetDefaults.

Associazione di un parametro shader a un determinato registro

Il compilatore assegna automaticamente i registri alle variabili globali. Il compilatore assegna l'ambiente al registro del sampler s0, SparkleNoise a registrare s1 e k_s a registrare costante c0 (presupponendo che non siano già stati assegnati altri registri di campionamento o costanti) per le tre variabili globali seguenti:

sampler Environment;
sampler SparkleNoise;
float4 k_s;

È anche possibile associare le variabili a un registro specifico. Per forzare l'assegnazione del compilatore a un determinato registro, usare la sintassi seguente:

register(RegisterName)

dove RegisterName è il nome del registro specifico. Gli esempi seguenti illustrano la sintassi di assegnazione di registro specifica, in cui l'ambiente di esempio sarà associato al registro di sampler s1, SparkleNoise sarà associato al registro di sampler s0 e k_s sarà associato al registro costante c12:

sampler Environment : register(s1);
sampler SparkleNoise : register(s0);
float4 k_s : register(c12);

Rendering di uno shader programmabile

Viene eseguito il rendering di uno shader impostando lo shader corrente nel dispositivo, inizializzando le costanti shader, indicando al dispositivo in cui provengono i dati di input variabili e infine eseguendo il rendering delle primitive. Ognuna di queste operazioni può essere eseguita chiamando rispettivamente i metodi seguenti:

Debug di shader

L'estensione DirectX per Microsoft Visual Studio .NET offre un debugger HLSL completamente integrato all'interno dell'ambiente di sviluppo integrato di Visual Studio .NET. Per preparare il debug dello shader, è necessario installare gli strumenti appropriati nel computer (vedere Debug di shader in Visual Studio (Direct3D 9)).

Guida alla programmazione per HLSL