In che modo un campionatore GLSL determina la minificazione, e quindi il livello di mipmap di una trama?

StackOverflow https://stackoverflow.com/questions/7367606

Domanda

Sto lavorando con OpenGL ES (tramite WebGL), ma penso che questa domanda sia applicabile anche al profilo OpenGL completo.

Supponiamo di creare una trama OpenGL con livelli di mipmap completi e ho impostato la sua texture_min_filter su più vicino_mipmap_nearest. Supponiamo inoltre di avere uno shader frammento che campiona questa trama. Il livello di MIPMAP è scelto in base al grado di minificazione della trama, ma come viene scelto il grado di minificazione?

Nel mio caso, sto sintetizzando (all'interno dello shader) le coordinate della trama che uso per campionare la mia trama. In effetti, le mie coordinate di texture non si basano su alcun varia in arrivo. Anche se ho abilitato il mipmapping su questa trama, non sembra avere alcun effetto. È previsto? Devo calcolare il LOD da solo e utilizzare il parametro BIAS su Texture2D? (non c'è texture2dlod, dato che sto usando ES)

È stato utile?

Soluzione

I blocchi di pixel adiacenti sono calcolati in parallelo. (IIRC i chip Powervr eseguono un blocco 4x4 alla volta, ad esempio.) Quando si chiama Texture2D nel tuo shader di frammenti, il campionatore sta recuperando tutti i 16 campioni per tutti i 16 pixel contemporaneamente, e così hanno le informazioni di adiacenza necessarie per calcolare la minificazione livello. Questo è parte del motivo per cui è così importante per i pixel adiacenti campionare dalle aree vicine della trama.

Si noti che questo vale solo per gli shader frammenti. In Vertex Shaders viene sempre utilizzato il primo livello di mipmap, (a meno che non si usi la versione LOD di Texture2D.)

Altri suggerimenti

Puoi calcolare arbitraria le coordinate di trama e lo shader agirà di conseguenza ... entro una restrizione. I tuoi calcoli non possono coinvolgere alcuna logica condizionale. Possono comportare vari, uniformi, costanti, valori campionati da altre trame, qualunque cosa tu voglia. Ma nel momento in cui scivolerai tanto quanto un operatore (figuriamoci un If State), sei nei guai.

E dal momento che sei a Opengl es Land, non hai davvero gli strumenti per tirarti fuori da quel problema. Desktop GL 3.0 ti dà il textureGrad Set di funzioni, che consente di calcolare i gradienti prima di raggiungere la logica condizionale. Ma senza quello, non c'è molto che puoi fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top