Ho uno shader con un'uniforme _color e un campionatore. Ora voglio disegnare con _color SOLO se il campionatore non è stato impostato. C'è un modo per capire che siamo all'interno dello shader? (Sfortunatamente il campionatore restituisce 1,1,1,1 quando non è assegnato, il che rende impossibile il missaggio tramite alpha)Come verificare se un campionatore è nullo in glsl?
risposta
Non è possibile farlo. Il campionatore è una maniglia opaca che fa riferimento a un'unità di trama. Non sono sicuro che la specifica garantisca (1,1,1,1) quando si campiona da un'unità in cui non è legata alcuna trama o se si tratta di un comportamento non definito.
Quello che puoi fare è usare solo un'altra uniforme per passare da un campionatore all'altro o il colore uniforme, o semplicemente usare diversi shader e passare da uno all'altro. Ci sono anche le possibilità dei sottoprogrammi qui, ma non so se questo sarebbe il giusto appraoch per un problema così semplice.
Mi sono imbattuto in questa domanda cercando di risolvere un problema simile.
Dal GLSL 4,30
int textureQueryLevels(gsamplerX sampler);
è una funzione build-in. Nello spec. GLSL. p. 151 dice
Il valore zero verrà restituito se al campionatore non è associata alcuna trama o una trama incompleta.
Negli OpenGL-Forms ho trovato una voce a questa domanda che suggerisce di utilizzare
ivecY textureSize(gsamplerX sampler,int lod);
e test se la dimensione trama è maggiore di zero. Ma questo, a mio avviso, non è coperto dallo standard. Nella sezione 11.1.3.4 della specifica OpenGL si dice che
Se il livello immagine Struttura calcolato è fuori dell'intervallo [levelbase, q], i risultati sono indefiniti ...
Modifica : Ho appena provato questo metodo sul mio problema e poiché risulta che nvidia ha alcuni problemi con questa funzione, risultando in un valore diverso da zero quando non è associata alcuna trama. (Vedi nvidia bug report dal 2015)