2010-09-03 10 views
6

Estoy usando OpenGL para hacer algunos cálculos de GPGPU mediante la combinación de un sombreador de vértices y un sombreador de fragmentos. Necesito hacer cálculos en una imagen a diferente escala. Me gustaría utilizar mipmaps ya que su generación puede ser automática y acelerada por hardware. Sin embargo, no logro acceder a las texturas de mipmap en el sombreador de fragmentos.En un sombreador de fragmentos GLSL, ¿cómo acceder a texel en un nivel específico de mipmap?

He habilitado la generación automática de mipmap: glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

Intenté usar texture2DLod en el shader sin tener suerte, simplemente seguía dando la textura normal. También intenté usar glTextureParameteri (GL_BASE_LEVEL, X) en el programa principal y no cambió nada.

¿Cómo harías eso?

Estoy usando Linux. Mi tarjeta gráfica es una Nvidia Quadro bastante vieja. Here es mi salida glxinfo con todas las extensiones compatibles.

+0

He votado positivamente porque es "útil y claro", pero pareces hacer todo bien. ¿Qué dice glTextureSize (sampler, lod)? (En su sombreador de fragmentos) – Calvin1602

+0

No hay tal función disponible para mí. Creo que mi tarjeta es demasiado vieja (acabo de comprobar y la versión de GLSL es GL_ARB_shading_language_100). Eso explicaría mucho, pero no entiendo por qué el sombreador aceptaría la variante * Lod sin quejarse si no era compatible ... – Jim

+0

No entiendo tampoco por qué glTextureParameteri (GL_BASE_LEVEL, X) y glTextureParameteri (GL_MAX_LEVEL, X) las llamadas tampoco tienen efecto. Esto no está relacionado con GLSL ... Estoy bastante confundido en este momento. – Jim

Respuesta

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) 

¿Has probado uno de esos incorporados? También lod tiene que ser un tipo de flotador. ¿Qué errores/advertencias informa el compilador GLSL?

+0

Hola, lo siento por la gran demora. Probé la función texture2DLod. Lo extraño es que no importa qué valor le dé a 'lod', el valor devuelto es exactamente el mismo que con la búsqueda estándar de texture2D. No se producen errores o incluso advertencias en la compilación del sombreador. – Jim

1

intento:

glGenerateMipmapEXT(GL_TEXTURE_2D); 

Después de enlazar la textura. (Y antes de hacer la prestación por supuesto)

El glTexParameteri-GL_GENERATE_MIPMAP es obsoleto creo ... MFG Digi

1

La especificación GLSL 1,20 (sección 8.7) establece que los sombreadores de fragmentos no pueden elegir su propio nivel mipmap (y que la textura * función Lod solo está disponible en sombreadores de vértices). En todo caso, puede utilizar el parámetro de sesgo para las variantes que no son de Lod para cambiar el nivel de mipmap, pero solo puede cambiarlo en relación con lo que la tarjeta ya ha calculado para usted.

No sé si las últimas versiones de GLSL pueden haber cambiado eso.

+0

De hecho, han cambiado eso, como lo ha demostrado la primera respuesta a esta pregunta. –

Cuestiones relacionadas