¿Cuál es el tamaño óptimo de textura?

12

Recientemente agregué un empaquetador de texturas a mi proyecto que empaquetará una cierta cantidad de texturas en una sola, como esta:

Textura llena

Entonces, por ejemplo, este tiene un tamaño de 582x1023 píxeles. El objetivo de agregar estas texturas empaquetadas obviamente era mejorar el rendimiento, por lo que quería buscar el tamaño de textura óptimo para las texturas OpenGL (usando LWJGL). Lo que encontré fue que un tamaño de textura máximo ampliamente admitido parece ser 1024x1024, de acuerdo con esto, por ejemplo. Esto me parece extraño porque obviamente muchas texturas por sí solas serían más grandes que eso, entonces, ¿qué pasa con esas? Estoy bastante seguro de que la mayoría de las tarjetas gráficas admiten texturas más grandes que eso. ¿Puedo esperar razonablemente que la mayoría de las tarjetas gráficas manejen, por ejemplo, texturas 4096x4096 (o tal vez incluso más grandes que eso)?

Para llegar a mi segundo punto (espero que esto cuente como una pregunta, pero esencialmente se reduce al mismo problema): ¿Deberían las texturas dimensionarse a una potencia de 2 (256x256, 512x512, 1024x1024, 2048x2048, ..) y deberían ¿Rellené texturas más pequeñas que esa a la siguiente potencia de 2? De acuerdo con esta pregunta de 2011, no es un requisito, pero puede mejorar el rendimiento y evitar errores menores, y este de 2012 dice que definitivamente debe rellenar las texturas. Así que me doy cuenta de que estas preguntas se han hecho antes, pero están razonablemente fechadas para que las respuestas hayan cambiado y, además, cada una de ellas solo responde parcialmente a mi pregunta. ¿Cómo otros proyectos / manejan esto?

TL; DR: ¿Qué tamaños de texturas puedo esperar que manejen la mayoría de las tarjetas gráficas? ¿Cuáles son los tamaños óptimos de textura (o hay)? ¿Debo rellenar el ancho de las texturas a la siguiente potencia de 2?

flotothemoon
fuente
44
La GPU solo opera en potencias de 2. Si no rellena manualmente sus texturas, entonces la GPU (o el motor de su elección) lo hace por usted, lo que resulta en un ligero retraso en el tiempo de ejecución por textura, que puede sumar. Sin embargo, no puedo ofrecer ninguna ayuda sobre los tamaños de textura máximos / óptimos.
ketura
@ketura Ah ya veo, gracias. Digamos que tengo una imagen que es 513x10. ¿Sería más rápido rellenarlo a 1024x1024 y luego transferir todos estos píxeles vacíos o dejar que la GPU haga eso?
flotothemoon
44
No necesitarías ir tan alto. 1024 x 16 funcionarían; no necesita ser CUADRADO, solo una potencia de 2 en cada dirección. Aunque en ese caso consideraría seriamente si no pudiera ahorrar un píxel y reducirlo a 512x16, jajaja.
ketura

Respuestas:

6

Voy a tratar de responder esto, aunque YMMV. Utilizo el Steam Hardware Survey ( http://store.steampowered.com/hwsurvey?platform=pc ) para determinar cuál es la RAM de video (VRAM) disponible en la mayoría de las computadoras. Mirando los resultados a partir del 2015-10-13 (hoy), casi el 85% de las personas tienen 1024 MB de VRAM.

Su pregunta es muy amplia, ya que no indica el hardware de destino (consola, PC, computadora de mano, dispositivos móviles?) Voy a hablar sobre las PC y puede extrapolar para otras plataformas en función de las especificaciones de hardware.

Suponiendo 32 bits de color + alfa por píxel, es decir, 4 bytes por píxel, 1 GB de VRAM puede contener un máximo de ~ 256 millones de píxeles. Esto equivale a 256 texturas de 1K por 1K. Esto supone (incorrectamente) que solo desea mantener texturas en su VRAM, mientras que habrá una gran cantidad de otras cosas (por ejemplo, datos de malla, si está trabajando en 3D) para las que necesita dejar espacio. Probablemente también desee permitir más espacio para el mapeo MIP de texturas, que generalmente funciona mejor si sus texturas son potencias de dos.

Las consolas modernas (XBOX One y PS4) tienen 4-8 GB de RAM unificada, la mayoría de las computadoras de mano y dispositivos móviles tienen 1 - 2 GB de RAM unificada, con restricciones sobre cuánto puede asignar como VRAM.

Por lo general, crearía texturas 2K para que funcionara en la mayoría de las PC, permitiendo la opción de reducir la escala para dispositivos de gama baja. Si está escribiendo un juego 2D y desea apuntar a pantallas de mayor resolución (4K, iPad retina, etc.), puede usar texturas 4K para el fondo, pero para la mayoría de las otras partes, puede ser excesivo.

Espero que esto haya ayudado y no haya enturbiado las aguas.

Vijay Varadan
fuente
Gracias por la respuesta, definitivamente ayuda. En cuanto a la amplitud, perdón por eso, olvidé incluir algunos detalles: estoy desarrollando para PC en 2D. ¿Qué pasaría si usa texturas más grandes que el tamaño máximo de textura admitido? ¿No funciona en absoluto o simplemente se vuelve más lento?
flotothemoon
1
Parece que mi respuesta fue acertada. Verificando otras publicaciones en el foro del sitio Las texturas 2k son lo que debes soportar para que tu juego funcione en la mayoría de los dispositivos. El límite de tamaño de textura depende del hardware específico y la versión particular de OpenGL-ES. No estoy seguro de cuál sería el mensaje de error específico, pero vendría de OpenGL-ES cuando intentas cargar la textura. Enlaces útiles: answers.unity3d.com/questions/563094/… , forum.unity3d.com/threads/texture-sizes-and-videocards.281422 y feedback.wildfiregames.com/report/opengl/feature/…
Vijay Varadan
¿Cuándo intento cargar o intentar unir la textura? ¿O es eso lo mismo aquí?
flotothemoon