O mapeo de texturas, asignación de texturas ou texture mapping [1] [2] [3] é un método para mapear unha textura nun gráfico xerado por ordenador. A textura pode ser detalles de alta frecuencia, textura superficial ou cor.
A técnica orixinal foi iniciada por Edwin Catmull en 1974.[4] Texture mapping referíase orixinalmente ao mapeo difuso (diffuse mapping), un método que simplemente mapeaba píxeles dunha textura asignándoos a unha superficie 3D ("envolvendo" a imaxe ao redor do obxecto). Nas últimas décadas, a chegada da representación multipaso, a multitexturización, os mipmaps e mapeos máis complexos, como o mapeo de altura, o mapeo de golpes, o mapeo normal, o mapeo de desprazamento, o mapeo de reflexión, o mapeo especular, o mapeo de oclusión e moitas outras variacións da técnica (controlado por un sistema de materiais) permitiron simular imaxes próximas ao fotorrealismo en tempo real reducindo enormemente o número de polígonos e os cálculos de iluminación necesarios para construír unha escena 3D realista e funcional.
Unha texture map[5][6] é unha imaxe aplicada (mapeada) á superficie dunha forma ou polígono.[7] Esta pode ser unha imaxe de mapa de bits ou unha textura de procedemento. Poden almacenarse en formatos de ficheiros de imaxe comúns, referenciados por formatos de modelos 3D ou definicións de materiais, e reunirse en paquetes de recursos.
Poden ter 1-3 dimensións, aínda que 2 dimensións son máis comúns para superficies visibles. Para o seu uso con hardware moderno, os datos do mapa de texturas pódense almacenar en ordes en mosaico ou en mosaico para mellorar a coherencia da caché. As API de renderizado adoitan xestionar os recursos do mapa de texturas (que poden estar situados na memoria do dispositivo) como búfers ou superficies, e poden permitir " renderizar a textura "para efectos adicionais como o procesamento posterior ou o mapeo do contorno.
Normalmente conteñen datos de cor RGB (almacenados como cores directas, formatos comprimidos ou cor indexada) e ás veces unha canle adicional para mesturas alfa (RGBA), especialmente para billboards e texturas de superposición decal. É posible utilizar a canle alfa (que pode ser conveniente almacenar en formatos analizados polo hardware) para outros usos como a especularidade.
Pódense combinar varios mapas de texturas (ou canles) para controlar a especularidade, a normalidade, o desprazamento ou a dispersión subterránea, por exemplo, para renderizar a pel (skin).
Pódense combinar varias imaxes de textura en atlas de texturas ou texturas de matriz para reducir os cambios de estado do hardware moderno. (Poden considerarse unha evolución moderna dos gráficos de mapas de mosaicos). O hardware moderno adoita admitir texturas de mapas de cubos (cube map) con varias caras para mapear o contorno.
Os mapas de textura pódense adquirir mediante dixitalización / fotografía dixital, deseñados en software de manipulación de imaxes ou deseño gráfico como GIMP, Photoshop ou pintados sobre superficies 3D directamente cunha ferramenta de pintura 3D como Mudbox ou ZBrush.
Este proceso é semellante a aplicar papel estampado a unha caixa branca normal. A cada vértice dun polígono asígnaselle unha coordenada de textura (que no caso 2D tamén se coñece como coordenadas UV).[8] Isto pódese facer mediante a asignación explícita de atributos de vértice, editados manualmente nun paquete de modelaxe 3D mediante ferramentas de desenvoltura UV. Tamén é posible asociar co material unha transformación procesual de espazo 3D a espazo de textura. Isto pódese conseguir mediante a proxección plana ou, alternativamente, a cartografía cilíndrica ou esférica . As cartografías máis complexas poden considerar a distancia ao longo dunha superficie para minimizar a distorsión. Estas coordenadas interpolanse entre as caras dos polígonos para mostrar o mapa de texturas durante a representación. As texturas poden ser repetidas ou espelladas para estender un mapa de bits rectangular finito sobre unha área máis grande, ou poden ter un mapeo "inxectivo" único un a un (one-to-one) de cada peza dunha superficie (o que é importante para o mapeo de renderizado e o mapeo de luz, tamén coñecida como cocedura).
A asignación de texturas mapea a superficie do modelo (ou o espazo da pantalla durante a rasterización) no espazo de textura; neste espazo, o mapa de texturas é visible na súa forma non distorsionada. As ferramentas de desenvoltura UV (UV unwrapping) normalmente ofrecen unha vista no espazo de textura para a edición manual das coordenadas de textura. Algunhas técnicas de renderizado como a dispersión subterránea pódense realizar aproximadamente mediante operacións de textura-espazo.
A multitexturización é o uso de máis dunha textura á vez nun polígono.[9] Por exemplo, pódese usar unha textura de mapa de luz para iluminar unha superficie como alternativa a recalcular esa iluminación cada vez que se representa a superficie. As microtexturas ou texturas de detalle úsanse para engadir detalles de maior frecuencia, e os dirt maps poden engadir meteorización e variación; isto pode reducir moito a aparente periodicidade das texturas repetidas. Os gráficos modernos poden usar máis de 10 capas, que se combinan mediante sombreadores, para unha maior fidelidade. Outra técnica de multitextura é o bump mapping, que permite que unha textura controle directamente a dirección de orientación dunha superficie para os efectos dos seus cálculos de iluminación; pode dar un aspecto moi bo a unha superficie complexa (como a casca de árbores ou o formigón rugoso) que adquire detalles de iluminación ademais da cor detallada habitual. O bump mapping fíxose popular nos últimos videoxogos, xa que o hardware gráfico se tornou o suficientemente potente como para acomodarlo en tempo real.[10]
A forma en que as mostras (por exemplo, cando se ven como píxeles na pantalla) se calculan a partir dos texels (píxeles de textura) está rexida polo filtrado de texturas. O método máis barato é utilizar a interpolación do veciño máis próximo, pero a interpolación bilineal ou a interpolación trilineal entre mipmaps son dúas alternativas de uso habitual que reducen o aliasing ou os jaggies. No caso de que unha coordenada de textura estea fóra da textura, está fixada ou envolta. O filtrado anisotrópico elimina mellor os artefactos direccionais ao ver texturas desde ángulos de visión oblicuos.
A transmisión de texturas é un medio de usar fluxos de datos (data streams) para texturas, onde cada textura está dispoñible en dúas ou máis resolucións diferentes, para determinar que textura se debe cargar na memoria e usar en función da distancia do visor e da cantidade de memoria dispoñible para texturas. A transmisión de texturas permite que un motor de renderizado utilice texturas de baixa resolución para obxectos afastados da cámara do espectador e resolvelos en texturas máis detalladas, lidas desde unha fonte de datos, a medida que o punto de vista se achega aos obxectos.
Como optimización, é posible renderizar detalles dun modelo complexo de alta resolución ou dun proceso caro (como a iluminación global) nunha textura de superficie (posibelmente nun modelo de baixa resolución). A cocción tamén se coñece como mapeo de render (render mapping). Esta técnica úsase máis habitualmente para mapas lixeiros, pero tamén se pode usar para xerar mapas normais e mapas de desprazamento. Algúns xogos de ordenador (p. ex. Messiah) utilizaron esta técnica. O motor de software orixinal Quake utilizaba a cocción ao voo para combinar mapas de luz e mapas de cores (caché de superficie, surface caching).
A cocción pode usarse como unha forma de xeración de nivel de detalle, onde unha escena complexa con moitos elementos e materiais diferentes pode ser aproximada por un único elemento cunha única textura (single), que logo se reduce algorítmicamente para un menor custo de renderizado e menos chamadas. Tamén se usa para tomar modelos de gran detalle do software de escultura 3D (3D sculpting software) e da exploración de nubes de puntos e aproximalos con mallas máis adecuadas para a representación en tempo real.
Varias técnicas evolucionaron nas implementacións de software e hardware. Cada un ofrece diferentes compensacións en precisión, versatilidade e rendemento.
A asignación de texturas afines interpola linealmente as coordenadas de textura nunha superficie, e así é a forma máis rápida de mapeo de texturas. Algúns programas e hardware (como a PlayStation orixinal) proxectan vértices no espazo 3D na pantalla durante a representación e interpolan linealmente as coordenadas de textura no espazo da pantalla entre eles. Isto pódese facer incrementando as coordenadas UV do punto fixo ou mediante un algoritmo de erro incremental semellante ao algoritmo de liñas de Bresenham.
En contraste cos polígonos perpendiculares, isto leva a unha distorsión notable con transformacións de perspectiva (ver figura: a textura da caixa de verificación aparece dobrada), especialmente cando as primitivas están preto da cámara. Tal distorsión pódese reducir coa subdivisión do polígono en outros máis pequenos.
No caso de obxectos rectangulares, o uso de primitivas cuádruplos pode parecer menos incorrecto que o mesmo rectángulo dividido en triángulos, pero como a interpolación de 4 puntos engade complexidade á rasterización, a maioría das primeiras implementacións preferiron só triángulos. Algúns hardware, como o mapeo de texturas cara a adiante usado pola Nvidia NV1, foi capaz de ofrecer primitivos quad eficientes. Coa corrección da perspectiva (véxase máis abaixo) os triángulos fanse equivalentes e esta vantaxe desaparece.
Para os obxectos rectangulares que están en ángulo recto co espectador, como pisos e paredes, a perspectiva só debe ser corrixida nunha dirección a través da pantalla, en lugar de ambas. O mapa de perspectiva correcta pódese calcular nos bordos esquerdo e dereito do chan, e entón unha interpolación lineal afín a través dese tramo horizontal parecerá correcta, porque cada píxel ao longo desa liña está á mesma distancia do espectador.
A textura correcta da perspectiva ten en conta as posicións dos vértices no espazo 3D, en lugar de simplemente interpolar as coordenadas no espazo da pantalla 2D. Isto consegue o efecto visual correcto pero é máis caro de calcular. [11]
Para realizar a corrección de perspectiva das coordenadas de textura e , con sendo a compoñente de profundidade desde o punto de vista do espectador, podemos aproveitar que os valores , , e son lineais no espazo da pantalla a través da superficie que se está texturando. En cambio, o orixinal , e , antes da división, non son lineais pola superficie no espazo da pantalla. Polo tanto, podemos interpolar linealmente estes recíprocos a través da superficie, calculando valores corrixidos en cada píxel, para dar como resultado un mapeo de textura correcto en perspectiva.
Para iso, primeiro calculamos os recíprocos en cada vértice da nosa xeometría (3 puntos para un triángulo). Para vértice temos . Entón, interpolamos linealmente estes recíprocos entre o vértices (por exemplo, usando as coordenadas baricéntricas ), resultando en valores interpolados na superficie. Nun momento dado, isto produce o interpolado , e . Teña en conta que isto aínda non se pode usar como as nosas coordenadas de textura como a nosa división por alteraron o seu sistema de coordenadas.
Para corrixir de volta ao espazo calculamos primeiro o corrixido tomando de novo o recíproco . Despois usamos isto para corrixir o noso : e .[12]
Esta corrección fai que nas partes do polígono que están máis próximas ao espectador a diferenza de píxel a píxel entre as coordenadas de textura sexa menor (estirando a textura máis ampla) e nas partes máis afastadas esta diferenza é maior (comprimindo a textura).
O hardware de gráficos 3D normalmente admite a textura correcta da perspectiva. Varias técnicas evolucionaron para renderizar a xeometría mapeada de texturas en imaxes con diferentes compensacións calidade/precisión, que se poden aplicar tanto ao software como ao hardware.
Os mapeadores de texturas de software clásicos xeralmente só facían cartografía simple con como máximo un efecto de iluminación (normalmente aplicado a través dunha táboa de busca), e a corrección da perspectiva era unhas 16 veces máis cara.
O motor Doom restrinxiu o mundo a paredes verticais e pisos/teitos horizontais, cunha cámara que só podía xirar sobre o eixe vertical. Isto significaba que as paredes serían unha coordenada de profundidade constante ao longo dunha liña vertical e os pisos/teitos terían unha profundidade constante ao longo dunha liña horizontal. Unha cartografía afín rápida podería usarse nesas liñas porque sería correcta. Algúns renderizadores posteriores desta época simularon unha pequena cantidade de paso da cámara con cizallamento, o que permitiu a aparición dunha maior liberdade ao usar a mesma técnica de renderizado.
Algúns motores puideron renderizar mapas de altura mapeados con textura (p. ex Voxel Space de Nova Logic e o motor de Outcast) a través de algoritmos incrementais tipo Bresenham, que producen a aparencia dunha paisaxe mapeada con texturas sen o uso de primitivos xeométricos tradicionais. [13]
Cada triángulo pódese subdividir en grupos duns 16 píxeles para conseguir dous obxectivos. Primeiro, mantendo o muíño aritmético ocupado en todo momento. Segundo, producir resultados aritméticos máis rápidos.
Para a asignación de texturas en perspectiva sen soporte de hardware, un triángulo divídese en triángulos máis pequenos para a representación e utilízase o mapeo afín neles. A razón pola que esta técnica funciona é que a distorsión da cartografía afín faise moito menos perceptible en polígonos máis pequenos. A Sony PlayStation fixo un uso extensivo diso porque só admitía o mapeo afín no hardware pero tiña un rendemento de triángulo relativamente alto en comparación cos seus pares.
Os renderizadores de software xeralmente preferían a subdivisión da pantalla porque ten menos sobrecarga. Ademais, intentan facer unha interpolación lineal ao longo dunha liña de píxeles para simplificar a configuración (en comparación coa interpolación afín 2d) e, polo tanto, de novo a sobrecarga (tamén a asignación de texturas afines non encaixa no baixo número de rexistros da CPU x86 ). ; o 68000 ou calquera RISC é moito máis axeitado).
Tomouse un enfoque diferente para Quake, que calcularía as coordenadas correctas da perspectiva só unha vez cada 16 píxeles dunha liña de exploración e interpolaría linealmente entre elas, funcionando efectivamente á velocidade da interpolación lineal porque o cálculo correcto da perspectiva execútase en paralelo no coprocesador. Os polígonos represéntanse de forma independente, polo que pode ser posible cambiar entre vanos e columnas ou direccións diagonais dependendo da orientación do polígono normal para conseguir un z máis constante pero o esforzo parece non valer a pena.
Outra técnica foi aproximar a perspectiva cun cálculo máis rápido, como un polinomio. Outra técnica aínda usa o valor 1/z dos dous últimos píxeles debuxados para extrapolar linealmente o seguinte valor. A división faise entón partindo deses valores de xeito que só hai que dividir un pequeno resto pero a cantidade de contabilidade fai que este método sexa demasiado lento na maioría dos sistemas.
Finalmente, o motor de compilación ampliou o truco de distancia constante usado para Doom atopando a liña de distancia constante para polígonos arbitrarios e representando ao longo dela.
O hardware de mapeo de texturas foi desenvolvido orixinalmente para a simulación (por exemplo, como se implementou nos xeradores de imaxes Evans e Sutherland ESIG), e estacións de traballo de gráficos profesionais como Silicon Graphics, máquinas de efectos de vídeo dixitais de transmisión como o Ampex ADO e máis tarde apareceron en armarios Arcade, vídeos de consumo, consolas de xogos e tarxetas de vídeo para PC a mediados da década de 1990. Na simulación de voo, o mapeo de texturas proporcionou importantes pistas de movemento.
As unidades de procesamento de gráficos (GPU) modernas fornecen unidades de funcións fixas especializadas chamadas mostradores de texturas ou unidades de mapeo de texturas para realizar o mapeo de texturas, normalmente con filtrado trilineal ou mellor filtrado anisótropo multitap e hardware para decodificar formatos específicos como DXTn. A partir de 2016, o hardware de mapeo de texturas é omnipresente xa que a maioría dos SOC conteñen unha GPU adecuada.
Algún hardware combina a asignación de texturas coa determinación de superficies ocultas na representación diferida baseada en mosaicos ou na representación da liña de exploración ; tales sistemas só buscan os texels visibles a costa de utilizar un espazo de traballo maior para os vértices transformados. A maioría dos sistemas optaron polo enfoque Z-buffering, que aínda pode reducir a carga de traballo de mapeo de texturas coa clasificación de fronte a atrás.
Entre o hardware gráfico anterior, había dous paradigmas en competencia sobre como entregar unha textura á pantalla:
O mapeo de textura inversa é o método que se converteu en estándar no hardware moderno.
Con este método, un píxel da pantalla mapea a un punto da textura. Cada vértice dunha primitiva de renderizado proxéctase a un punto da pantalla, e cada un destes puntos está asignado a coordenadas au,v texel na textura. Un rasterizador interpolará entre estes puntos para cubrir cada píxel cuberto pola primitiva.
A vantaxe principal é que cada píxel cuberto por un primitivo percorrerase exactamente unha vez. Unha vez que se transforman os vértices dunha primitiva, a cantidade de traballo restante escala directamente coa cantidade de píxeles que cobre na pantalla.
A principal desvantaxe fronte á asignación de texturas cara a adiante é que o patrón de acceso á memoria no espazo de textura non será lineal se a textura está en ángulo coa pantalla. Esta desvantaxe adoita solucionarse mediante técnicas de caché de texturas (texture caching), como a disposición de memoria de texturas swizzled.
A interpolación lineal pode usarse directamente para mapear texturas afines sinxela e eficiente, pero tamén se pode adaptar para a corrección da perspectiva.
A asignación de texturas cara a adiante asigna cada texel da textura a un píxel da pantalla. Despois de transformar unha primitiva rectangular nun lugar da pantalla, un renderizador de mapeo de texturas cara a adiante itera a través de cada texel da textura, salpicando cada un nun píxel do búfer de fotogramas.
Este foi usado por algún hardware, como o Sega Saturn e o NV1.
A principal vantaxe é que se accede á textura nunha orde lineal sinxela, o que permite almacenar en caché os datos de textura de forma moi eficiente. Non obstante, este beneficio tamén é a súa desvantaxe: a medida que un primitivo se fai máis pequeno na pantalla, aínda ten que iterar sobre cada texel da textura, o que fai que moitos píxeles sexan redundantes.
Este método tamén é moi adecuado para renderizar primitivos cuádruplos en lugar de reducilos a triángulos, o que proporcionaba unha vantaxe cando a textura correcta da perspectiva non estaba dispoñible no hardware. Isto débese a que a distorsión afín dun cuadrilátero parece menos incorrecta que o mesmo cuadrilátero dividido en dous triángulos (consulta o mapeado de texturas afins arriba). O hardware NV1 tamén permitiu un modo de interpolación cuadrática para proporcionar unha aproximación aínda mellor da corrección da perspectiva.
As implementacións de hardware existentes non proporcionaron un mapeo efectivo de coordenadas UV, que se converteu nunha técnica importante para a modelaxe 3D e axudou a recortar correctamente a textura cando o primitivo pasa polo bordo da pantalla. Estas deficiencias poderían ser abordadas cun desenvolvemento posterior, pero desde entón o deseño da GPU avanzou principalmente cara ao mapeo inverso.
Ademais do renderizado 3D, a dispoñibilidade de hardware de mapeo de texturas inspirou o seu uso para acelerar outras tarefas:
É posible utilizar hardware de mapeo de texturas para acelerar tanto a reconstrución de conxuntos de datos de voxel a partir de exploracións tomográficas como para visualizar os resultados (renderizado de volume, volume rendering).[14]
Moitas interfaces de usuario usan a asignación de texturas para acelerar as transicións animadas dos elementos da pantalla, por exemplo Exposé en macOS.