Quali sono i vantaggi del modello di compilazione di GLSL?

4

GLSL è fondamentalmente diverso da altre soluzioni di shader perché il server (driver GPU) è responsabile della compilazione degli shader. Cg e HLSL sono (afaik) generalmente compilati a priori e inviati alla GPU in questo modo.

Questo causa alcuni problemi pratici del mondo reale:

  • molti driver forniscono compilatori buggy
  • I compilatori
  • differiscono in termini di rigore (una GPU può accettare un programma mentre un'altra non lo farà)
  • anche noi non possiamo sapere come sarà ottimizzato il codice assemblatore

Quali sono gli aspetti positivi dell'attuale approccio GLSL? Ne vale la pena?

    
posta Kos 09.06.2012 - 12:02
fonte

2 risposte

3

Il vantaggio è che è facile scrivere programmi che generano dinamicamente il codice GLSL, ad esempio è possibile generare dinamicamente nuovi shader quando le luci che interessano un oggetto cambiano.

Lo svantaggio è che il tempo di compilazione può diventare significativo e che i compilatori in genere fanno meno ottimizzazione (per mantenere i tempi di compilazione verso il basso).

    
risposta data 09.06.2012 - 22:52
fonte
-1

Questo modello punta sulla portabilità del codice, disaccoppiando il codice GLSL da qualsiasi piattaforma specifica (hardware e / o software). Poiché si tratta di uno standard senza royalty, ogni venditore può decidere di supportare la piattaforma GLSL. Normalmente questo supporto comporterà un'implementazione del driver OpenGL specifico per il sistema operativo.

many drivers provide buggy compilers

Probabilmente ci sono molti bug nei driver là fuori, ma la mia esperienza dice che la maggior parte delle volte il bug non è un bug, ma è un fraintendimento delle specifiche GLSL. Ad esempio, questo codice funziona bene su piattaforme NVIDIA, mentre non su piattaforme Intel:

// We are in fragment shader

in vec2 ds_TexCoord[3];

uniform int ds_FrontMaterialAmbientTexCoord = -1;

uniform sampler2D ds_FrontMaterialAmbientTexture;

...

if (ds_FrontMaterialAmbientTexCoord >= 0) {
    fragmentMaterial.AmbientColor = texture(ds_FrontMaterialAmbientTexture, ds_TexCoord[ds_FrontMaterialAmbientTexCoord]);
}

Il trucco qui è che non è possibile accedere alla matrice usando direttamente una variabile uniforme. Infatti il codice che gira su piattaforme NVIDIA e Intel è:

if (ds_FrontMaterialAmbientTexCoord >= 0) {
     int index = ds_FrontMaterialAmbientTexCoord;
    fragmentMaterial.AmbientColor = texture(ds_FrontMaterialAmbientTexture, ds_TexCoord[index]);
}

Una volta ottenuti alcuni trucchi, scrivere codice GLSL portatile è come scrivere C.

compilers differ in terms of strictness (one GPU can accept a program while another won't)

Utilizza il più stretto. AMD e Intel hanno un'interpretazione rigorosa delle specifiche GLSL, mentre NVIDIA no: questo perché il compilatore GLSL si basa sull'implementazione CG, anzi è più permissivo di quello che dovrebbe essere consentito.

La soluzione è semplice: seguire rigorosamente le specifiche GLSL.

also we can't know how the assembler code will be optimised

Se puoi ottimizzare, scrivi in assembly ARB ( qui alcune specifiche e suggerimenti) . Il driver probabilmente farà il meglio che può per la piattaforma attuale, farai meglio?

Ricorda che l'obiettivo principale è la portabilità!

    
risposta data 01.09.2012 - 13:59
fonte

Leggi altre domande sui tag