¿Debo usar texturas no dimensionadas a una potencia de 2?

40

En los primeros días de OpenGL y DirectX, se requería que los tamaños de textura fueran potencias de dos. Esto significaba que la interpolación de los valores flotantes se podía hacer muy rápidamente, utilizando desplazamiento y tal.

Desde OpenGL 2.0 (y anterior, a través de una extensión) se han admitido dimensiones de textura sin potencia de dos.

¿Las texturas de potencia de dos tienen ventajas de rendimiento en las GPU modernas integradas y discretas? ¿Qué ventajas tienen las texturas sin potencia de dos?

¿Tiene una población importante de computadoras de escritorio tarjetas que admitan texturas sin potencia de dos?

Será
fuente

Respuestas:

15

¿Existen ventajas de rendimiento al apegarse a las texturas de potencia de dos en las GPU modernas integradas y discretas?

La mayoría de las GPU modernas admiten texturas sin potencia de dos (NPOT) y las manejan bien. La caída del rendimiento es bastante pequeña. Pero hay pocos problemas a considerar:

  • Cuando se usa la textura NPOT, se necesita más espacio en la RAM, al igual que la textura POT del siguiente tamaño. Técnicamente solo desperdicias el espacio que podría usarse para poner algo allí;

  • Las texturas NPOT pueden manejarse notablemente más lentamente (en OpenGL 2.1 tuve una caída de rendimiento de hasta el 30%) en comparación con POT del siguiente tamaño;

  • Las GPU más antiguas y las GPU integradas / en chip no son tan avanzadas, a menudo admiten texturas NPOT, pero el soporte es bastante lento y torpe;

  • Incluso las GPU más antiguas pueden negarse a aceptar / mostrar texturas NPOT;

  • Podría haber artefactos de bordes causados ​​por la interpolación de mip-map, su textura de 25x25 podría tener una franja negra donde se agregaron píxeles para rellenarla en un tamaño de 32x32.

PD: No estoy seguro acerca de los dispositivos móviles, podría haber aún más restricciones con respecto a las texturas POT.

¿Qué ventajas tienen las texturas sin potencia de dos, si las hay?

Hasta donde sé, solo hay 2 ventajas:

  • Ocupan menos espacio en el disco duro si no están empaquetados (cuando las áreas vacías empaquetadas agregan muy poco)
  • Puede ahorrar tiempo escribiendo NPOT -> Convertidor POT. Necesitará uno para la versión de lanzamiento, pero usar texturas NPOT para diseñar y crear prototipos de interfaces / modelos está bien

¿Hay grandes poblaciones de usuarios de escritorio que no tienen tarjetas que admitan texturas sin potencia de dos?

Hasta donde yo sé y probado en PC - Sí. Eso incluye un porcentaje mayor de GPU de errores de caída de velocidad / menor y un porcentaje menor de tarjetas que no manejarán NPOT en absoluto.

Kromster dice que apoya a Mónica
fuente
6

Un uso común de las texturas sin potencia de dos es para 'tamaño de pantalla' o 'tamaño de media pantalla' (y así sucesivamente) para representar texturas de destino utilizadas para efectos de postprocesamiento.

En estos casos, no se necesitan mapas MIP, el búfer siempre está descomprimido, por lo que los tamaños de textura extraños causan menos problemas aquí

bluescrn
fuente
4

Hubo limitaciones para las texturas NPOT en hardware antiguo. Como se mencionó en este wiki de OpenGL , algunos equipos antiguos requieren que las NPOT no tengan mapas MIP, las texturas comprimidas requieren una alineación de píxeles 4x4, pero el hardware nuevo debe manejarlo perfectamente.

En mi experiencia, incluso algunos equipos relativamente nuevos experimentan un gran rendimiento si usa texturas NPOT en lugar de POT. No sé cuál es el problema; Es posible que en alguna combinación de estados de renderizado, el renderizado se realice realmente en software. Por lo tanto, a menos que tenga buenas razones, le recomiendo que intente utilizar los POT tanto como sea posible.

En cuanto a por qué usar NPOT en lugar de POT: si tiene imágenes que son de dimensiones NPOT, digamos, por ejemplo, 1600x1200, usar 2048x2048 píxeles de superficie desperdiciará mucha memoria de video.

Jari Komppa
fuente
3
Si está utilizando formatos de textura comprimidos en la memoria (PVR o DXT, por ejemplo), la ampliación a la siguiente potencia de dos utilizará significativamente menos memoria de textura que una textura NPOT sin comprimir, pero más pequeña.
Tetrad
3
Su redacción es un poco vaga, así que lo siento si esto es redundante con lo que está tratando de decir: las texturas comprimidas aún requieren tamaños de píxeles en múltiplos de 4, incluso en hardware moderno que admite texturas NPOT.
1
Esperaría que el hardware actual todavía tenga texturas en mosaico / swizzling en los controladores cuando los cargue. Esto cambia el diseño de la textura para que el acceso sea más óptimo para el hardware. Las consolas (no incluyo XNA en eso) requieren que realice manualmente esta optimización de diseño en su propia cadena de herramientas, estoy bastante seguro de que solo funcionan en POW2.
Roger Perkins
-1

la potencia de 2 texturas aumenta el rendimiento en aproximadamente un 30% para cualquier tipo de GPU, no solo las GPU antiguas (un 30% más rápido es la diferencia entre una GPU de gama alta y una promedio), toman un 30% más de memoria ram pero se necesita menos vram, aumentan la calidad en proporcionando un tamaño de textura adecuado para una distancia específica, funciona como suavizado para texturas. Los artefactos de línea oscura deben ser manejados por motores de juegos y los motores aaa los manejan bien

yusef ghatavi
fuente
Esto solo proporciona una ventaja (ya especificada) de las texturas de potencia de dos, no aborda la pregunta en sí, por lo que usaría texturas sin potencia de dos dadas las ventajas anteriores.
Josh
lo siento, entendí mal la pregunta, por el poder de 2 estás restringido a 2048, 1024, 512, etc. Probablemente esta sea la razón principal
yusef ghatavi
también non power of 2 son útiles para texturas que no necesitan mipmaps como texturas gui y texturas para personajes en primera persona que siempre están cerca de la cámara
yusef ghatavi
-3

Mi programador de arte es solo del tamaño correcto.

Sin duda, simplifica mi lógica de visualización saber que si quiero establecer una textura en la parte superior izquierda de la pantalla, puedo configurar 0,0 como la parte superior izquierda de la textura y ver toda la textura allí en la ubicación correcta, mientras que si tuviera que agregar 0alpha padding, posicionar la textura contra el borde de la pantalla sería más complejo. Además, por supuesto, que 0alpha todavía tiene que ser alfa mezclado, y si estoy mirando texturas opacas, prefiero no tener un canal alfa.

DeadMG
fuente
66
Por lo general, uno coloca polígonos, no texturas, en la pantalla. Los polígonos pueden recibir cualquier UV que sea necesario; no necesariamente tienen que ir de 0 a 1; si su textura tiene solo 30 de ancho, está bien ir a 0.9375 (que es otra razón por la cual las texturas POT son buenas, los UV son exactamente representables).