2010-09-03 14 views
6

Sto usando OpenGL per eseguire alcuni calcoli GPGPU tramite la combinazione di uno shader di vertici e uno shader di frammenti. Ho bisogno di fare calcoli su un'immagine su scala diversa. Mi piacerebbe usare mipmaps poiché la loro generazione può essere automatica e accelerata dall'hardware. Tuttavia non riesco a ottenere l'accesso alle trame mipmap nello shader dei frammenti.In uno shader di frammenti GLSL, come accedere a texel a un livello specifico di mipmap?

Ho abilitato la generazione automatica di mipmap: glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

Ho provato a usare texture2DLod nello shader senza fortuna, semplicemente mantenendo la texture normale. Ho anche provato a usare glTextureParameteri (GL_BASE_LEVEL, X) nel programma principale e non ha cambiato nulla.

Come lo faresti?

Sto usando Linux. La mia scheda grafica è una Nvidia Quadro piuttosto vecchia. Here è il mio output glxinfo con tutte le estensioni supportate.

+0

Invito la tua domanda perché è "utile e chiara", ma sembra che tu faccia tutto bene. Cosa dice glTextureSize (sampler, lod)? (Nel tuo frammento di shader) – Calvin1602

+0

Non esiste una funzione del genere a mia disposizione. Penso che la mia carta sia troppo vecchia (ho appena controllato e la versione di GLSL è GL_ARB_shading_language_100). Questo spiegherebbe molto ma non capisco perché lo shader accetti la variante * Lod senza lamentarsi se non è supportato ... – Jim

+0

Non capisco neanche perché glTextureParameteri (GL_BASE_LEVEL, X) e glTextureParameteri (GL_MAX_LEVEL, X anche le chiamate non hanno alcun effetto. Questo non è legato al GLSL ... Sono abbastanza confuso al momento. – Jim

risposta

3
gvec4 textureLod (gsampler1D sampler, float P, float lod) 
gvec4 textureLod (gsampler2D sampler, vec2 P, float lod) 
gvec4 textureLod (gsampler3D sampler, vec3 P, float lod) 
gvec4 textureLod (gsamplerCube sampler, vec3 P, float lod) 
float textureLod (sampler1DShadow sampler, vec3 P, float lod) 
float textureLod (sampler2DShadow sampler, vec3 P, float lod) 
gvec4 textureLod (gsampler1DArray sampler, vec2 P, float lod) 
gvec4 textureLod (gsampler2DArray sampler, vec3 P, float lod) 
float textureLod (sampler1DArrayShadow sampler, vec3 P, float lod) 

Hai provato uno di quelli built-in? Anche lod deve essere un tipo float. Quali errori/avvertenze stanno segnalando il compilatore GLSL?

+0

Ciao, mi dispiace per il lungo ritardo. Ho provato la funzione texture2DLod. La cosa strana è che, indipendentemente dal valore che attribuisco a "lod", il valore restituito è esattamente lo stesso della ricerca standard di texture2D. Nessun errore o persino avvertimento sono prodotti nella compilazione dello shader. – Jim

1

prova:

glGenerateMipmapEXT(GL_TEXTURE_2D); 

dopo si associa il texture. (E prima di fare il rendering ovviamente)

Il glTexParameteri-GL_GENERATE_MIPMAP è deprecato penso ... MfG Digi

1

La specifica GLSL 1.20 (sezione 8.7) afferma che gli shader frammento non possono scegliere il proprio livello mipmap (e che la funzione texture * Lod è disponibile solo in vertex shader). Se possibile, potresti essere in grado di utilizzare il parametro bias per le varianti non Lod per modificare il livello mipmap, ma può solo cambiarlo rispetto a ciò che la carta ha già calcolato per te.

Non so se le ultime versioni di GLSL potrebbero averlo cambiato.

+0

In effetti hanno cambiato ciò, come la prima risposta a questa domanda ha mostrato. –

Problemi correlati