Articulo de referencia

Compresión de texturas S3

La compresión de texturas S3 ( S3TC ) (a veces también llamada DXTn , DXTC o BCn ) es un grupo de algoritmos de compresión de texturas con pérdida relacionados , desarrollados o...

La compresión de texturas S3 ( S3TC ) (a veces también llamada DXTn , DXTC o BCn ) es un grupo de algoritmos de compresión de texturas con pérdida relacionados , desarrollados originalmente por Iourcha et al. de S3 Graphics, Ltd. [ 1 ] [ 2 ] para su uso en su acelerador de gráficos por computadora Savage 3D . El método de compresión es sorprendentemente similar a la compresión de celdas de color publicada anteriormente , [ 3 ] que a su vez es una adaptación de la codificación de truncamiento de bloques publicada a finales de la década de 1970. A diferencia de algunos algoritmos de compresión de imágenes (por ejemplo, JPEG ), la compresión de datos de tasa fija de S3TC junto con el acceso a memoria única (cf. compresión de celdas de color y algunos esquemas basados ​​en VQ ) lo hizo muy adecuado para su uso en la compresión de texturas en gráficos por computadora 3D acelerados por hardware . Su posterior inclusión en DirectX 6.0 y OpenGL 1.3 de Microsoft (a través de la extensión GL_EXT_texture_compression_s3tc ) propició la adopción generalizada de la tecnología entre los fabricantes de hardware y software. Si bien S3 Graphics ya no compite en el mercado de aceleradores gráficos, se cobraron tarifas de licencia por el uso de la tecnología S3TC hasta octubre de 2017, por ejemplo, en consolas de videojuegos y tarjetas gráficas. El amplio uso de S3TC generó un requisito de facto para que los controladores de OpenGL la soportaran, pero su condición de estar sujeta a patentes representó un obstáculo importante para las implementaciones de código abierto , [ 4 ] mientras que existían enfoques de implementación que intentaban evitar las partes patentadas. [ 5 ]

Patentar

Algunas de las múltiples patentes de la USPTO sobre compresión de textura S3 (por ejemplo, la US 5956431 A) expiraron el 2 de octubre de 2017. [ 6 ] Sin embargo , al menos una patente de continuación, la US 6,775,417 , tuvo una prórroga de 165 días. Esta patente de continuación expiró el 16 de marzo de 2018.

Códecs

Existen cinco variantes del algoritmo S3TC (denominadas DXT1 a DXT5 , en referencia al código FourCC asignado por Microsoft a cada formato), cada una diseñada para tipos específicos de datos de imagen. Todas convierten un bloque de píxeles de 4×4 en una cantidad de 64 o 128 bits, lo que resulta en relaciones de compresión de 6:1 con datos de entrada RGB de 24 bits o 4:1 con datos de entrada RGBA de 32 bits . S3TC es un algoritmo de compresión con pérdida , lo que provoca una degradación de la calidad de la imagen, un efecto que se minimiza al poder aumentar las resoluciones de textura manteniendo los mismos requisitos de memoria. Las imágenes dibujadas a mano, similares a dibujos animados, no se comprimen bien, ni tampoco los datos de mapas normales , que suelen generar artefactos . El algoritmo de compresión 3Dc de ATI es una modificación de DXT5 diseñada para superar las deficiencias de S3TC con respecto a los mapas normales. id Software solucionó los problemas de compresión del mapa normal en Doom 3 moviendo el componente rojo al canal alfa antes de la compresión y volviéndolo a mover durante el renderizado en el sombreador de píxeles . [ 7 ]

Al igual que muchos algoritmos modernos de compresión de imágenes, S3TC solo especifica el método utilizado para descomprimir las imágenes, lo que permite a los desarrolladores diseñar el algoritmo de compresión según sus necesidades específicas, aunque la patente aún cubre los algoritmos de compresión. Las tarjetas Nvidia GeForce 256 a GeForce 4 también utilizaban interpolación de 16 bits para renderizar texturas DXT1, lo que provocaba bandas al descomprimir texturas con gradientes de color. Esto, una vez más, generó una impresión desfavorable de la compresión de texturas , ajena a los fundamentos del códec en sí.

DXT1

DXT1 (también conocido como compresión de bloques 1 o BC1) es la variación más pequeña de S3TC, que almacena 16 píxeles de entrada en 64 bits de salida, que consisten en dos valores de color RGB 5:6:5 de 16 bits.do0{\displaystyle c_{0}}ydo1{\displaystyle c_{1}}y una tabla de búsqueda de dos bits de 4×4.

Sido0>do1{\displaystyle c_{0}>c_{1}}(compare estos colores interpretándolos como dos números sin signo de 16 bits), luego se calculan otros dos colores, de manera que para cada componente,do2=23do0+13do1{\textstyle c_{2}={2 \over 3}c_{0}+{1 \over 3}c_{1}}ydo3=13do0+23do1{\textstyle c_{3}={1 \over 3}c_{0}+{2 \over 3}c_{1}}. Este modo funciona de forma similar al modo 0xC0 del códec de vídeo original de Apple . [ 8 ]

De lo contrario, sido0do1{\displaystyle c_{0}\leq c_{1}}, entoncesdo2=12do0+12do1{\textstyle c_{2}={1 \over 2}c_{0}+{1 \over 2}c_{1}}ydo3{\displaystyle c_{3}}El negro transparente corresponde a un formato alfa premultiplicado . Este color a veces provoca un borde negro alrededor del área transparente cuando se utiliza el filtrado de textura lineal y la prueba alfa, debido a que los colores se interpolan entre el color del texel opaco y el texel transparente negro vecino.

Luego se consulta la tabla de búsqueda para determinar el valor de color de cada píxel, correspondiendo un valor de 0 ado0{\displaystyle c_{0}}y un valor de 3 correspondiente ado3{\displaystyle c_{3}}.

DXT2 y DXT3

DXT2 y DXT3 (también conocidos colectivamente como Block Compression 2 o BC2) convierten 16 píxeles de entrada (correspondientes a un bloque de píxeles de 4x4) en 128 bits de salida, que consisten en 64 bits de datos del canal alfa (4 bits para cada píxel) seguidos de 64 bits de datos de color, codificados de la misma manera que DXT1 (con la excepción de que siempre se utiliza la versión de 4 colores del algoritmo DXT1 en lugar de decidir qué versión usar en función de los valores relativos dedo0{\displaystyle c_{0}}ydo1{\displaystyle c_{1}}).

En DXT2, los datos de color se interpretan como premultiplicados por alfa ; en DXT3, se interpretan como no premultiplicados por alfa. Por lo general, DXT2/3 son adecuados para imágenes con transiciones alfa abruptas, entre áreas translúcidas y opacas.

DXT4 y DXT5

DXT4 y DXT5 (también conocidos colectivamente como Block Compression 3 o BC3) convierten 16 píxeles de entrada en 128 bits de salida, que consisten en 64 bits de datos del canal alfa (dos valores alfa de 8 bits y una tabla de búsqueda de 4×4 de 3 bits) seguidos de 64 bits de datos de color (codificados de la misma manera que DXT1).

Siα0>α1{\displaystyle \alpha _{0}>\alpha _{1}}, luego se calculan otros seis valores alfa, de tal manera queα2=6α0+1α17{\textstyle \alpha _{2}={{6\alpha _{0}+1\alpha _{1}} \over 7}},α3=5α0+2α17{\textstyle \alpha _{3}={{5\alpha _{0}+2\alpha _{1}} \over 7}},α4=4α0+3α17{\textstyle \alpha _{4}={{4\alpha _{0}+3\alpha _{1}} \over 7}},α5=3α0+4α17{\textstyle \alpha _{5}={{3\alpha _{0}+4\alpha _{1}} \over 7}},α6=2α0+5α17{\textstyle \alpha _{6}={{2\alpha _{0}+5\alpha _{1}} \over 7}}, yα7=1α0+6α17{\textstyle \alpha _{7}={{1\alpha _{0}+6\alpha _{1}} \over 7}}.

De lo contrario, siα0α1{\textstyle \alpha _{0}\leq \alpha _{1}}, se calculan otros cuatro valores alfa de tal manera queα2=4α0+1α15{\textstyle \alpha _{2}={{4\alpha _{0}+1\alpha _{1}} \over 5}},α3=3α0+2α15{\textstyle \alpha _{3}={{3\alpha _{0}+2\alpha _{1}} \over 5}},α4=2α0+3α15{\textstyle \alpha _{4}={{2\alpha _{0}+3\alpha _{1}} \over 5}}, yα5=1α0+4α15{\textstyle \alpha _{5}={{1\alpha _{0}+4\alpha _{1}} \over 5}}conα6=0{\displaystyle \alpha _{6}=0}yα7=255{\displaystyle \alpha _{7}=255}.

Luego se consulta la tabla de búsqueda para determinar el valor alfa de cada píxel, donde un valor de 0 corresponde aα0{\displaystyle \alpha _{0}}y un valor de 7 correspondiente aα7{\displaystyle \alpha _{7}}Los datos de color de DXT4 están premultiplicados por alfa, mientras que los de DXT5 no. Debido a que DXT4/5 utilizan un esquema de alfa interpolado, generalmente producen mejores resultados para gradientes de alfa (transparencia) que DXT2/3.

Otras variantes

BC4 y BC5

BC4 y BC5 (Compresión de Bloques 4 y 5) se añaden en Direct3D 10. Reutilizan la codificación del canal alfa que se encuentra en DXT4/5 (BC3). [ 9 ]

  • BC4 almacena 16 píxeles de entrada de un solo canal (por ejemplo, escala de grises) en 64 bits de salida, codificados de forma casi [ 10 ] similar a los alfas de BC3. La paleta ampliada proporciona una mayor calidad.
  • BC5 almacena 16 píxeles de entrada de doble canal (por ejemplo, mapa normal del espacio tangente) en 128 bits de salida, que constan de dos mitades, cada una codificada como BC4.

BC6H y BC7

BC6H (a veces BC6) y BC7 (Block Compression 6H y 7) se agregan en Direct3D 11. [ 9 ]

  • BC6H codifica 16 píxeles RGB HDR (float16) de entrada en 128 bits de salida. Básicamente, trata float16 como 16 valores enteros de magnitud y signo, e interpola dichos enteros linealmente. Funciona bien para bloques sin cambios de signo. Se definen un total de 14 modos, aunque la mayoría difieren mínimamente: solo se utilizan realmente dos modos de predicción. [ 10 ]
  • BC7 codifica 16 píxeles RGB8/RGBA8 de entrada en 128 bits de salida. Puede entenderse como una versión mucho mejorada de BC3. [ 10 ]

BC6H y BC7 tienen un algoritmo mucho más complejo con una selección de modos de codificación. Como resultado, la calidad es mucho mejor. [ 9 ] Estos dos modos también están especificados con mucha más precisión, con rangos de desviación aceptados. Los modos BCn anteriores decodifican de forma ligeramente diferente entre los distintos fabricantes de GPU. [ 10 ]

Comparación del formato S3TC

preacondicionamiento de datos

Las texturas BCn se pueden comprimir aún más para su almacenamiento y distribución en disco ( supercompresión de texturas ). Una aplicación descomprimiría esta capa adicional y enviaría los datos BCn a la GPU como de costumbre.

BCn se puede combinar con Oodle Texture, un preprocesador con pérdida que modifica la textura de entrada para que la salida de BCn se comprima más fácilmente con un compresor LZ77 ( optimización de tasa-distorsión ). BC7 específicamente también puede usar "bc7prep", un paso sin pérdida para recodificar la textura en un formato más compresible (que requiere su inversa en la descompresión). [ 11 ]

Crunch es otra herramienta que realiza RDO y opcionalmente una recodificación adicional. [ 12 ]

En 2021, Microsoft produjo un algoritmo de compresión "BCPack" específicamente para texturas comprimidas con BCn. Las Xbox Series X y S cuentan con soporte de hardware para descomprimir flujos BCPack. [ 13 ]

Véase también

Referencias

  1. US 5956431 "Compresión de imágenes basada en bloques de tasa fija con valores de píxeles inferidos" 
  2. US 5956431 , Iourcha, Konstantine I.; Nayak, Krishna S. y Hong, Zhou, "Sistema y método para compresión de imágenes basada en bloques de tasa fija con valores de píxeles inferidos", publicado el 21 de septiembre de 1999 
  3. Liou, D.-M.; Huang, Y.; Reynolds, N. (1990). "Un nuevo sistema de imágenes basado en microcomputadora con técnica C/Sup 3/". IEEE TENCON'90: Conferencia de la Región 10 del IEEE de 1990 sobre Sistemas Informáticos y de Comunicación. Actas de la conferencia . IEEE . págs. 555–559 . doi : 10.1109/TENCON.1990.152671 . ISBN  0-87942-556-3.
  4. "Situación de S3TC en la página oficial de información de DRI" . Dri.freedesktop.org. Archivado del original el 19 de enero de 2012. Consultado el 25 de enero de 2012 .
  5. S2TC: Una posible solución alternativa para la situación de la patente S3TC. Archivado el 13 de mayo de 2016 en Wayback Machine en phoronix.
  6. Yates, Tom (15 de febrero de 2017). "Por eso bebo: un análisis del estado legal de Fedora" . LWN.net . Archivado del original el 1 de marzo de 2017. Consultado el 16 de febrero de 2017. ... La patente sobre la compresión de texturas S3 expira el 2 de octubre de 2017, por lo que los juegos de Steam podrían funcionar mejor en Fedora después de esa fecha. ...  
  7. Duffy, Robert (27 de julio de 2004). "Requisitos de vídeo de DOOM 3" . Gamershell.com. Archivado del original el 3 de enero de 2008. Consultado el 25 de enero de 2012 .
  8. Togni, Roberto, et al. " Apple RPZA archivado el 4 de julio de 2017 en Wayback Machine ". MultimediaWiki.
  9. 1 2 3 Reed, Nathan. "Entendiendo los formatos de compresión de texturas BCn" . Blog de programación de Nathan Reed . Archivado del original el 09/11/2020 . Recuperado el 01/09/2020 .
  10. 1 2 3 4 Giesen, Fabian “ryg” (4 de octubre de 2021). "Decodificación BCn de GPU" . El blog de ryg . Archivado del original el 24 de julio de 2023. Recuperado el 24 de julio de 2023 .
  11. "Compresión de texturas Oodle" . www.radgametools.com . Archivado del original el 18 de marzo de 2023. Consultado el 3 de abril de 2023 .Parte de código abierto mencionada: bc7enc_rdo Archivada el 2 de febrero de 2021 en Wayback Machine
  12. "crunch open source texture compression library" . GitHub . Archivado del original el 9 de septiembre de 2016. Consultado el 13 de septiembre de 2016 .
  13. "Descripción general de DirectStorage - Kit de desarrollo de juegos de Microsoft" . 16 de marzo de 2023. Archivado del original el 3 de agosto de 2023. Consultado el 3 de agosto de 2023 .
  • Oficina de Patentes y Marcas de los Estados Unidos, Base de datos de texto completo e imágenes de patentes, resultado para US 5956431 A
  • Búsqueda de asignación de patente de la USPTO para US 5956431 A