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à!