2010-09-03 20 views
6

J'utilise OpenGL pour faire des calculs GPGPU en combinant un vertex shader et un fragment shader. J'ai besoin de faire des calculs sur une image à une échelle différente. Je voudrais utiliser des mipmaps car leur génération peut être automatique et matérielle accélérée. Cependant, je n'arrive pas à accéder aux textures mipmap dans le fragment shader. J'ai activé la génération automatique de mipmap: glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);Dans un fragment de fragment GLSL, comment accéder à texel à un niveau de mipmap spécifique?

J'ai essayé d'utiliser texture2DLod dans le shader sans aucune chance, il a simplement continué à donner la texture normale. J'ai également essayé d'utiliser glTextureParameteri (GL_BASE_LEVEL, X) dans le programme principal et cela n'a rien changé.

Comment le feriez-vous? J'utilise Linux. J'utilise Linux. Ma carte graphique est une Nvidia Quadro assez ancienne. Here est ma sortie de glxinfo avec toutes les extensions supportées.

+0

J'ai mis votre question en suspens parce que c'est "utile et clair", mais vous semblez tout faire correctement. Que dit glTextureSize (sampler, lod)? (Dans votre fragment shader) – Calvin1602

+0

Il n'y a pas une telle fonction à ma disposition. Je pense que ma carte est trop ancienne (je viens de vérifier et la version de GLSL est GL_ARB_shading_language_100). Cela expliquerait beaucoup mais je ne comprends pas pourquoi le shader accepterait la variante * Lod sans se plaindre s'il n'était pas supporté ... – Jim

+0

Je ne comprends pas non plus pourquoi le glTextureParameteri (GL_BASE_LEVEL, X) et glTextureParameteri (GL_MAX_LEVEL, X) les appels n'ont aucun effet non plus. Ce n'est pas lié à GLSL ... Je suis assez confus en ce moment. – Jim

Répondre

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) 

Avez-vous essayé un de ces intégrés? De plus, lod doit être de type flottant. Quelles erreurs/avertissements rapportent le compilateur GLSL?

+0

Salut, désolé pour le long délai. J'ai essayé la fonction texture2DLod. Ce qui est étrange, c'est que quelle que soit la valeur que je donne à 'lod', la valeur retournée est exactement la même que pour la recherche standard texture2D. Aucune erreur ou même avertissement n'est produit lors de la compilation du shader. – Jim

1

essayer:

glGenerateMipmapEXT(GL_TEXTURE_2D); 

après vous liez la texture. (Et avant de faire le rendu bien sûr)

Le glTexParameteri-GL_GENERATE_MIPMAP est dépréciée Je pense ... MfG Digi

1

GLSL 1.20 spécification (section 8.7) indique que les shaders de fragments ne peuvent pas choisir leur propre niveau de mipmap (et que la fonction texture * Lod n'est disponible que dans les vertex shaders). Si quelque chose, vous pouvez être en mesure d'utiliser le paramètre de polarisation aux variantes non-Lod pour changer le niveau de mipmap, mais il ne peut que le modifier par rapport à ce que la carte a déjà calculé pour vous.

Je ne sais pas si les dernières versions de GLSL peuvent avoir changé cela.

+0

En effet, ils ont changé cela, comme l'a montré la toute première réponse à cette question. –