uso texture texturas example ejemplos opengl textures pyopengl mipmaps

texturas - texture opengl example c++



¿Cuántos mipmaps tiene una textura en OpenGL? (3)

No importa que yo haya creado la textura en primer lugar y debería saber perfectamente cuántos mipmaps cargué o generé para ella. Estoy haciendo esto para una prueba de unidad. No parece haber un parámetro glGetTexParameter para averiguarlo. Lo más cerca que he venido es algo como esto:

int max_level; glGetTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &max_level ); int max_mipmap = -1; for ( int i = 0; i < max_level; ++i ) { int width; glGetTexLevelParameter( GL_TEXTURE_2D, i, GL_TEXTURE_WIDTH, &width ); if ( 0 == width ) { max_mipmap = i-1; break; } )

De todos modos, glGetTexLevelParameter() devolverá un ancho de 0 para un mipmap inexistente si estoy usando una GPU NVidia, pero con Mesa, devuelve GL_INVALID_VALUE , lo que me lleva a creer que esto es mucho lo que está mal .

¿Cómo puedo saber con qué niveles de mipmap he poblado una textura?


La especificación es un poco confusa en esto. Dice que obtendrá GL_INVALID_VALUE si el parámetro de nivel es "más grande que el máximo nivel de detalle permitido". No se indica exactamente cómo se define esto.

La documentación para la función lo aclara un poco, diciendo que es el número máximo posible de LOD para la mayor textura posible ( GL_MAX_TEXTURE_SIZE ). Otras funciones similares, como la familia glFramebufferTexture explícitamente como el límite para GL_INVALID_VALUE . Así que esperaría eso.

Por lo tanto, Mesa tiene un error. Sin embargo, puede GL_INVALID_VALUE esto suponiendo que 0 o un error GL_INVALID_VALUE significa que se ha alejado del final de la matriz mipmap.

Dicho esto, sugeriría emplear glTexStorage y nunca tener que volver a hacer la pregunta. Esto evitará por la fuerza que alguien establezca MAX_LEVEL en un valor que sea demasiado grande. Es bastante nuevo, desde GL 4.2, pero está implementado (o lo estará muy pronto) en todo el hardware que no sea de Intel y que aún sea compatible.


Parece que actualmente no hay forma de consultar cuántos niveles de mipmap tiene una textura, aparte de la prueba / error de OP con la verificación de valor no válido de @NicolBolas. Para la mayoría de los casos, supongo que su rendimiento no importaría si el tamaño del nivel 0 no cambia con frecuencia.

Sin embargo, si se asume que la textura no tiene un gamedev.net/topic/621709-query-number-of-mipmap-levels , las especificaciones dan el cálculo preferido (tenga en cuenta el uso del floor y no el ceiling como se muestra en algunos ejemplos):

numLevels = 1 + floor(log2(max(w, h, d)))

  1. ¿Cuál es la regla de reducción de dimensión para cada nivel de mipmap sucesivamente más pequeño?

    Cada nivel de mipmap cada vez más pequeño es la mitad del tamaño del nivel anterior, pero si este valor medio es un valor fraccionario, debe redondear al siguiente entero más grande.
    ...
    Tenga en cuenta que esta extensión es compatible con otras reglas compatibles, ya que simplemente relaja el error y las condiciones de integridad de los mipmaps. Al mismo tiempo, tiene sentido proporcionar a los desarrolladores una única regla coherente, ya que es poco probable que los desarrolladores deseen generar mipmaps para diferentes reglas innecesariamente. Una regla razonable es suficiente y preferible, y la convención de "piso" es la mejor opción.

    [ARB_texture_non_power_of_two]

Por supuesto, esto se puede verificar con el método OPs, o en mi caso cuando recibí un GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT con glFramebufferTexture2D(..., numLevels) .


Suponiendo que esté creando mipmaps de forma estándar, el número de imágenes únicas será algo así como ceil (log_2 (max (ancho, alto))) + 1. Esto se puede derivar fácilmente al notar que los mipmaps reducen el tamaño de la imagen en un factor de dos cada vez hasta que hay un solo píxel.