Unity 5.4 (actualmente en versión beta), traerá una característica muy esperada (desde 2013) que es texturas de matriz, en el mismo vano que ArrayTexture de OpenGL . Sin embargo, después de leer un poco sobre las matrices-texturas y los atlas de texturas, todavía no puedo entender las diferencias técnicas en su uso por parte de las CPU y GPU.
Por lo tanto, para ser más específicos, me gustaría pedir una explicación sobre las principales diferencias entre cómo la CPU y la GPU tratan el atlas de textura y las matrices de textura y, lo que es más importante, cómo estas diferencias pueden afectar el rendimiento y el manejo de la memoria (p. Ej. cómo las matrices de texturas pueden tener más rendimiento que los atlas de texturas, etc.
Si faltan detalles técnicos sobre la implementación de Unity debido a su desafortunada fuente cerrada, estaría muy contento con una respuesta con respecto a OpenGL.s ArrayTexture.
fuente
Respuestas:
Como se señaló en los comentarios anteriores, el rendimiento dependerá de la implementación, su hardware en particular y lo que está tratando de hacer con las texturas, por lo que la única respuesta confiable allí es perfilar cada alternativa.
Sin embargo, existen algunas diferencias en términos de cómo usa cada opción, que se aplicarán de manera consistente:
Una gran diferencia es que, para las texturas de matriz, cada textura se trata por separado para fines como envolver coordenadas de textura o mipmapping.
Esto evita problemas comunes con los atlas de texturas donde necesitamos agregar relleno entre muestras de texturas adyacentes para evitar que las muestras en sus bordes se desangren juntas, especialmente en niveles de mip más profundos.
Esto también significa que si desea que sus texturas se mezclen, puede usar el hardware de muestreo de textura para hacerlo al igual que con una textura de vainilla. Con los atlas, generalmente tenemos que hacer los cálculos de mosaico en nuestro sombreador de fragmentos, ya que el muestreador solo envuelve / refleja / sujeta / coordina las coordenadas de textura sobre todo el atlas, no los mosaicos individuales dentro de él.
La principal restricción con las texturas de matriz es que requieren que todas sus texturas constituyentes tengan la misma resolución y número de niveles de mip. Si está tratando de agrupar texturas con necesidades de resolución muy diferentes (por ejemplo, almacenar mosaicos de terreno cuyo LoD se cae con la distancia en una textura virtual ), entonces puede que desee la flexibilidad de un atlas.
fuente
GL_MAX_ARRAY_TEXTURE_LAYERS
. En mi GPU semi-moderna, esto es 2048, así que si quieres toneladas de texturas pequeñas, este límite podría ser demasiado bajo.