2014-07-19 18 views
6

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

7

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.

1

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)

Problemi correlati