Como funciona a renderização de jogos em 3D: texturização e filtragem de textura

imagem

No terceiro artigo sobre renderização em jogos 3D, descobriremos o que acontece com o mundo 3D após o processamento do vértice e a rasterização da cena. A texturização é um dos estágios mais importantes da renderização, apesar de apenas calcular e alterar as cores de uma grade bidimensional de blocos multicoloridos.

A maioria dos efeitos visuais nos jogos modernos se resume ao uso deliberado de texturas - sem eles, os jogos pareceriam chatos e sem vida. Então, vamos ver como tudo funciona!

Parte 1: processamento de vértices

Parte 2: rasterização e rastreamento de raios

Vamos começar com um simples


Você pode pegar qualquer jogo tridimensional mais vendido lançado no ano passado e dizer com confiança que todos eles têm algo em comum: eles usam mapas de textura (ou apenas texturas ). Esse é um termo tão comum que, ao pensar em texturas, a maioria das pessoas apresenta a mesma figura: um simples quadrado ou retângulo plano contendo uma imagem de uma superfície (grama, pedra, metal, tecido, rosto, etc.).

Porém, quando usadas e combinadas usando cálculos complexos, essas imagens simples em uma cena 3D podem criar imagens incrivelmente realistas. Para entender como isso é possível, vamos desligá-los completamente e ver como serão os objetos do mundo 3D sem texturas.

Como vimos nos artigos anteriores, o mundo 3D é composto de vértices - formas simples que se movem e depois colorem. Eles são usados ​​para criar primitivas, que por sua vez são compactadas em uma grade bidimensional de pixels. Como não usaremos texturas, precisamos colorir esses pixels.

Um dos métodos que pode ser aplicado é chamado de sombreamento simples : a cor do primeiro vértice da primitiva é obtida e, em seguida, essa cor é aplicada a todos os pixels cobertos pela figura na varredura. Parece algo como isto:


Obviamente, a chaleira parece irrealista, e não menos importante por causa das cores irregulares da superfície. As cores saltam de um nível para outro, não há transições suaves. Uma solução para o problema pode ser usar o sombreamento Gouraud .

Nesse processo, as cores dos vértices são obtidas, após o qual a cor muda ao longo da superfície do triângulo. Para isso, é usada interpolação linear . Parece complicado, mas, na realidade, isso significa que se, por exemplo, um lado do primitivo tiver uma cor de 0,2 vermelho e o outro 0,8 vermelho, o meio da figura terá uma cor no meio entre 0,2 e 0,8 (ou seja, 0,5).

Esse processo é bastante simples e essa é sua principal vantagem, porque simplicidade significa velocidade. Muitos jogos 3D mais antigos usavam essa técnica porque o equipamento de computação era limitado em suas capacidades.


Barrett e Cloud em toda a grandeza do sombreamento de Gouraud (Final Fantasy VII, 1997)

Mas mesmo essa solução tem problemas - se a luz cair bem no meio do triângulo, seus cantos (e vértices) podem não transmitir essa propriedade. Isso significa que o brilho criado pela luz pode ser completamente perdido.

Embora o sombreamento simples e o sombreamento de Gouraud ocupem o devido lugar nas ferramentas de renderização, os exemplos mostrados acima são candidatos claros ao aprimoramento da textura. E para entender bem o que acontece quando a textura é sobreposta à superfície, voltaremos no tempo ... já em 1996.

Breve história do jogo e da GPU


Há cerca de 23 anos, a id Software lançou o Quake, e se tornou um marco importante. Embora este não tenha sido o primeiro jogo a usar polígonos e texturas 3D para renderizar ambientes, foi definitivamente um dos primeiros a usá-los efetivamente.

Mas ela fez outra coisa também - ela mostrou o que pode ser feito usando o OpenGL (essa API de gráficos estava na primeira versão da época) e também ajudou muito a primeira geração de placas gráficas como Rendition Verite e 3Dfx Voodoo .


Picos de iluminação e texturas simples. Limpe 1996, limpe Quake.

Pelos padrões modernos, o Voodoo era extremamente simples: sem suporte a gráficos 2D, sem processamento de vértice, apenas o processamento de pixel mais simples. No entanto, ela era linda:


Imagem: Museu VGA

Ela tinha um chip inteiro (TMU) para obter um pixel de uma textura e outro chip (FBI) para depois misturá-lo com um pixel raster. O mapa pode executar alguns processos adicionais, por exemplo, a implementação de efeitos de neblina ou transparência, mas isso, em essência, termina com seus recursos.

Se observarmos a arquitetura subjacente à estrutura e operação da placa gráfica, veremos como esses processos funcionam.


Especificação 3Dfx. Fonte: Falconfly Central

O chip do FBI recebeu dois valores de cores e os misturou; um deles pode ser um valor de uma textura. O processo de mixagem é matematicamente bastante simples, mas varia um pouco, dependendo do que é mixado e da API usada para executar as instruções.

Se observarmos o que o Direct3D nos oferece em relação às funções e operações de mixagem, veremos que cada pixel é multiplicado pela primeira vez por um número de 0,0 a 1,0. Isso determina quanto a cor do pixel afetará o resultado final. Em seguida, duas cores de pixel alteradas são adicionadas, subtraídas ou multiplicadas; em algumas funções, é executada uma operação lógica na qual, por exemplo, o pixel mais brilhante é sempre selecionado.


Imagem: Blog de tecnologia do Taking Initiative

A imagem acima mostra como isso funciona na prática; observe que o valor alfa do pixel é usado como um coeficiente para o pixel esquerdo . Este número indica a quantidade de transparência do pixel.

Em outros estágios, o valor de neblina é aplicado (é retirado da tabela criada pelo programador e, em seguida, são executados os mesmos cálculos de mistura); realizando verificações e alterações na visibilidade e transparência; no final, a cor do pixel é gravada na memória da placa gráfica.

Por que você precisa dessa excursão pela história? Bem, apesar da relativa simplicidade do design (especialmente se comparado aos monstros modernos), esse processo descreve os princípios fundamentais da texturização: pegamos os valores das cores e as misturamos para que os modelos e ambientes pareçam como deveriam em uma situação específica.

Os jogos modernos fazem a mesma coisa, a única diferença é o número de texturas usadas e a complexidade dos cálculos de mistura. Juntos, eles simulam os efeitos visuais encontrados nos filmes ou a interação da iluminação com diferentes materiais e superfícies.

Noções básicas de texturização


Para nós, uma textura é uma imagem 2D plana sobreposta aos polígonos que compõem a estrutura 3D no quadro. No entanto, para um computador, esse é apenas um pequeno bloco de memória na forma de uma matriz 2D. Cada elemento da matriz indica o valor da cor de um dos pixels na imagem da textura (normalmente denominada texels - pixels de textura).

Cada vértice do polígono possui um conjunto de duas coordenadas (geralmente denotadas como u, v ), informando ao computador qual pixel da textura está associado a ele. O próprio vértice possui um conjunto de três coordenadas ( x, y, z ), e o processo de vincular texels aos vértices é chamado de mapeamento de textura .

Para ver como isso acontece, vejamos a ferramenta que já usamos várias vezes nesta série de artigos - WebGL de renderização em tempo real . Por enquanto, também descartamos a coordenada z dos vértices e consideramos tudo em um plano.


Da esquerda para a direita: as coordenadas u, v da textura, diretamente ligadas às coordenadas x, y dos vértices dos cantos. Na segunda imagem, as coordenadas y são aumentadas nos vértices superiores , mas, como a textura ainda está anexada a elas, ela se estende verticalmente. A textura já foi alterada na imagem correta: os valores de u aumentaram, mas como resultado, a textura foi compactada e depois repetida.

Isso aconteceu porque, apesar de, de fato, a textura ter se tornado mais alta devido ao aumento do valor de u , ela ainda deve se encaixar no primitivo - na verdade, a textura parcialmente repetida. Esta é uma maneira de implementar o efeito frequentemente encontrado em jogos 3D: repetir texturas. Exemplos desse efeito podem ser vistos em cenas com paisagens pedregosas ou gramadas, bem como com paredes de tijolos.

Agora vamos mudar a cena para que haja mais primitivas e retornar novamente a profundidade da cena. A vista de paisagem clássica é mostrada abaixo, mas agora a textura da caixa é copiada e repetida para todas as primitivas.


A textura da caixa em seu formato gif original tem um tamanho de 66 KB e uma resolução de 256 x 256 pixels. A resolução inicial da parte do quadro coberta pelas texturas da caixa é de 1900 x 680, ou seja, do ponto de vista da “área” de pixel, essa área deve exibir apenas 20 texturas de caixa.

Mas é óbvio que vemos muito mais do que vinte caixas, e isso significa que a textura da caixa à distância deve ser muito menor que 256 x 256 pixels. De fato , eles foram submetidos a um processo chamado “minificação de textura” (sim, essa palavra existe em inglês!). Agora, vamos repetir, mas desta vez aproxime a câmera de uma das gavetas.


Não se esqueça que a textura tem um tamanho de apenas 256 x 256 pixels, mas aqui vemos uma textura que é maior que a metade da imagem, com uma largura de 1900 pixels. Essa textura foi submetida a uma operação de "ampliação da textura" .

Esses dois processos de textura ocorrem constantemente em jogos 3D, porque quando a câmera se move pela cena, os modelos se aproximam ou se afastam, e todas as texturas aplicadas às primitivas devem ser dimensionadas juntamente com os polígonos. Do ponto de vista da matemática, esse é um pequeno problema; de fato, mesmo os chips gráficos integrados mais simples podem fazer esse trabalho facilmente. No entanto, reduzir e ampliar as texturas são novos desafios que precisam ser abordados de alguma forma.

Mini-cópias de texturas aparecem em cena


O primeiro problema a resolver para texturas é a distância. Se retornarmos à primeira imagem com uma paisagem de caixas, as caixas localizadas perto do horizonte terão um tamanho de apenas alguns pixels. Portanto, tentar compactar uma imagem de 256 x 256 pixels em um espaço tão pequeno é inútil por dois motivos.

Primeiro, a textura menor ocupa menos memória da placa gráfica, o que é conveniente, porque você pode tentar ajustá-la em um cache menor. Isso significa que é menos provável que seja excluído do cache, ou seja, o uso repetido dessa textura fornecerá um desempenho aprimorado, porque os dados estarão na memória próxima. Pela segunda razão, retornaremos em breve, porque está associado ao mesmo problema que surge em texturas próximas à câmera.

A solução padrão para o problema da necessidade de compactar texturas grandes em pequenas primitivas é usar texturas mip (mipmaps) . Essas são versões em tamanho reduzido da textura original; eles podem ser gerados pelo próprio mecanismo (usando os comandos de API apropriados) ou pré-criados pelos designers de jogos. Cada nível subsequente de textura mip tem metade do tamanho em comparação com o anterior.

Ou seja, para a textura da caixa, as dimensões serão: 256 x 256 → 128 x 128 → 64 x 64 → 32 x 32 → 16 x 16 → 8 x 8 → 4 x 4 → 2 x 2 → 1 x 1.


Todas as texturas mip são empacotadas juntas, portanto a textura tem o mesmo nome de arquivo, mas aumenta em tamanho. A textura é compactada de tal maneira que as coordenadas u, v não apenas determinam qual texel é sobreposto no pixel no quadro, mas também com qual textura mip. Em seguida, os programadores escrevem um renderizador, com base no valor da profundidade de pixel do quadro, que determina qual textura mip usar. Por exemplo, se o valor for muito alto, o pixel estará muito distante, o que significa que você pode usar uma pequena textura mip.

Leitores atentos podem notar a falta de texturas mip - eles têm que pagar por elas aumentando o tamanho das texturas. A textura original da caixa era de 256 x 256 pixels, mas como você pode ver na imagem acima, a textura com texturas mip agora tem um tamanho de 384 x 256. Sim, possui muito espaço vazio, mas não importa como embalamos texturas menores, em geral o tamanho da textura de um lado aumentará em pelo menos 50%.

Mas isso é verdade apenas para texturas mip criadas anteriormente; se o mecanismo de jogo estiver programado para gerá-los corretamente, o aumento não será superior a 33% do tamanho da textura original. Portanto, devido a um pequeno aumento na quantidade de memória para armazenar texturas mip, obtemos um ganho em desempenho e qualidade visual.

Abaixo está uma comparação de imagens com as texturas mip desativadas / ativadas:


No lado esquerdo da imagem, as texturas das caixas foram usadas "como estão", o que levou ao aparecimento de granularidade e ao chamado moiré à distância. À direita, o uso de texturas mip permitia transições mais suaves e, no horizonte, a textura da caixa fica embaçada em uma cor uniforme.

No entanto, quem quer que as texturas embaçadas estragem o cenário de seu jogo favorito?

Bilinear, trilinear, anisotrópico - tudo isso é para mim uma letra chinesa


O processo de seleção de um pixel de uma textura para sobrepor-se a um pixel em um quadro é chamado de texturas de amostragem e, em um mundo ideal, haveria uma textura que corresponde idealmente ao primitivo para o qual foi projetado, independentemente do tamanho, posição, direção e assim por diante. Em outras palavras, a amostragem da textura seria um simples mapeamento de pixel texel individual.

Mas, como não é assim, há vários fatores a serem considerados na amostragem de texturas:

  • A textura foi reduzida ou ampliada?
  • A textura é uma fonte ou textura mip?
  • Em que ângulo a textura é exibida?

Vamos analisá-los em ordem. O primeiro fator é bastante óbvio: se a textura foi aumentada, no primitivo haverá mais texels cobrindo o pixel no primitivo do que o necessário; ao diminuir, o oposto é verdadeiro - agora cada texel deve cobrir vários pixels. E isso é um problema.

O segundo fator não causa problemas, porque as texturas mip são usadas para contornar o problema de amostrar as texturas de primitivas longínquas; portanto, a única tarefa é exibir as texturas em ângulo. E sim, isso também é um problema. Por quê? Porque todas as texturas são imagens geradas para visualização “estritamente na frente”. Falando em linguagem matemática, a textura normal da superfície corresponde à nominal da superfície na qual a textura é atualmente exibida.

Portanto, se os texels são muito poucos ou muitos, ou estão localizados em ângulo, é necessário um processo adicional chamado "filtragem de textura" . Se esse processo não for usado, obtemos o seguinte:


Aqui substituímos a textura da caixa por uma textura com a letra R, para mostrar mais claramente em que confusão a imagem se transforma sem filtrar as texturas!

APIs gráficas como Direct3D, OpenGL e Vulkan fornecem o mesmo conjunto de tipos de filtragem, mas usam nomes diferentes para eles. De fato, todos eles se resumem ao seguinte:

  • Amostragem no ponto próximo
  • Filtragem linear de textura
  • Filtragem de textura anisotrópica

De fato, a amostragem do ponto mais próximo não é um filtro, pois, com ele, apenas o texel mais próximo do pixel de textura necessário é amostrado (por exemplo, copiado da memória) e, em seguida, é misturado com a cor original do pixel.

Aqui a filtragem linear vem em nosso auxílio. As coordenadas texel necessárias u, v são transferidas para o equipamento de amostragem, mas, em vez de levar o texel mais próximo dessas coordenadas, o amostrador usa quatro texels. São texels localizados acima, abaixo, à esquerda e à direita do texel que são selecionados por amostragem dos pontos mais próximos.

Esses quatro texels são então misturados usando uma fórmula com pesos. No Vulkan, por exemplo, a fórmula é assim:


T denota a cor texel, onde f é o resultado da filtração e 1-4 é a cor de quatro texels amostrados. Os valores alfa e beta são obtidos dependendo de quão longe o ponto com coordenadas u, v está do meio da textura.

Felizmente para os envolvidos com gráficos 3D, isso acontece automaticamente no chip gráfico. Na verdade, é exatamente isso que o chip TMF do cartão 3dfx Voodoo fez: ele amostrou quatro texels e depois os misturou. No Direct3D, esse processo tem um nome estranho para a filtragem bilinear.mas desde os dias do Quake e do chip TMU, as placas gráficas já aprenderam a executar a filtragem bilinear em apenas um ciclo de clock (é claro, se a textura já estiver localizada na memória mais próxima).

A filtragem linear pode ser usada junto com as texturas mip e, se você quiser complicar a filtragem, pode pegar quatro texels da textura e depois mais quatro do próximo nível da textura mip, misturando todos eles. E como é chamado no Direct3D? Filtragem trilinear . De onde vieram os "três" nesse processo ? Portanto, não sabemos ...

O último método de filtragem que vale a pena mencionar é anisotrópico . De fato, é uma melhoria no processo realizado por filtragem bilinear ou trilinear. Inicialmente, calculao grau de anisotropia da superfície primitiva (e este é um processo surpreendentemente complexo ) - esse valor aumenta a alteração na proporção da primitiva devido à sua orientação:


A figura acima mostra o mesmo quadrado primitivo com comprimentos laterais iguais; mas girando gradualmente, ele se transforma em um retângulo e sua largura muda mais do que sua altura. Portanto, a primitiva à direita tem um maior grau de anisotropia do que à esquerda (e no caso de um quadrado, o grau é zero).

Muitos jogos 3D modernos permitem ativar a filtragem anisotrópica e depois alterar seu nível (de 1x para 16x), mas o que realmente muda? Este parâmetro controla o número máximo de amostras texel adicionais que são coletadas em cada amostra linear inicial. Suponha que uma filtragem bilinear anisotrópica de 8x esteja ativada no jogo. Isso significa que, em vez de quatro valores texel, ele terá 32 valores.

A diferença ao usar a filtragem anisotrópica é claramente visível:


Vá até a imagem acima e compare a amostragem dos pontos mais próximos com uma filtragem trilinear anisotrópica máxima de 16x. Surpreendentemente suave!

Mas, para essa beleza suave das texturas, você precisa pagar com desempenho: nas configurações máximas, a filtragem trilinear anisotrópica receberá 128 amostras da textura para cada pixel de renderização. Mesmo com as melhores GPUs modernas, isso não pode ser alcançado em um ciclo de clock.

Se você usar, por exemplo, o AMD Radeon RX 5700 XT, cada um dos blocos de texturização dentro do processador pode usar até 32 endereços texel em um ciclo de clock e, no próximo ciclo de clock, carregar 32 valores texel da memória (cada um com tamanho de 32 bits) e misturar quatro deles em mais um tato. Ou seja, misturar 128 amostras de texel em uma requer pelo menos 16 ciclos de relógio.


GPU AMD RDNA Radeon RX 5700 com tecnologia de processo de 7 nanômetros

Se a velocidade do clock do 5700 XT for de 1605 MHz, dezesseis ciclos levarão apenas 10 nanossegundos . A execução desses ciclos para cada pixel em um quadro 4K usando apenas uma unidade de textura levará apenas 70 milissegundos. Ótimo, parece que o desempenho não é grande coisa!

Mesmo em 1996, o 3Dfx Voodoo e cartões semelhantes rapidamente lidaram com texturas. No máximo, eles podiam distribuir 1 texel com filtragem bilinear por ciclo e com uma frequência de chip TMU de 50 MHz, isso significava que 50 milhões de texels poderiam ser processados ​​por segundo. Um jogo rodando a 800 x 600 e 30 fps requer apenas 14 milhões de texels com filtragem bilinear por segundo.

No entanto, isso é verdade apenas sob a suposição de que todas as texturas estão na memória mais próxima e apenas um texel corresponde a cada pixel. Vinte anos atrás, a idéia da necessidade de sobrepor várias texturas em um primitivo era completamente estranha, mas hoje é um padrão. Vamos ver por que isso tudo muda.

Adicionar iluminação


Para entender por que a texturização se tornou tão importante, dê uma olhada nesta cena do Quake:


Esta é uma imagem sombria, porque a escuridão era a atmosfera do jogo, mas vemos que a escuridão não é a mesma em todos os lugares - alguns fragmentos de paredes e pisos são mais leves que outros, o que cria uma sensação de leveza nessas áreas.

As primitivas que compõem as paredes e o piso são sobrepostas com as mesmas texturas, mas há outra textura chamada “mapa de luz” misturada com os valores dos texels antes de serem aplicados aos pixels do quadro. Nos tempos do Quake, os mapas de iluminação eram calculados com antecedência e criados pelo mecanismo do jogo. Eles foram usados ​​para gerar níveis de iluminação estáticos e dinâmicos.

A vantagem de seu uso é que cálculos complexos de iluminação foram executados com texturas em vez de vértices, o que melhorou significativamente a aparência da cena à custa de custos de baixa velocidade. Obviamente, a imagem é imperfeita: no chão, é perceptível que a borda entre as áreas iluminadas e as sombras é muito nítida.

De muitas maneiras, um mapa de luz é apenas outra textura (não se esqueça de que todos são conjuntos de dados 2D regulares), portanto, esta cena é um dos primeiros exemplos de uso de estruturas múltiplas. Como o nome indica, este é um processo no qual duas ou mais texturas são sobrepostas em uma primitiva. O uso de mapas de iluminação no Quake tornou-se uma maneira de superar as limitações do sombreamento Gouraud, mas no processo de aumentar o leque de recursos das placas gráficas, os métodos de aplicação da multi-extensão também se expandiram.

O 3Dfx Voodoo, como muitos outros cartões daquela época, era limitado na quantidade de operações que ele poderia realizar em um único passe de renderização. De fato, um passe é um ciclo completo de renderização: do processamento de vértices à rasterização do quadro e, em seguida, alterando os pixels e gravando-os no buffer de quadros pronto. Vinte anos atrás, os jogos quase sempre usavam a renderização de uma passagem.


Nvidia GeForce 2 Ultra, por volta do final de 2000. Imagem: Wikimedia

Isso aconteceu porque o segundo processamento de vértice apenas para a aplicação de texturas adicionais era muito caro em termos de desempenho. Depois do Voodoo, tivemos que esperar alguns anos quando as placas gráficas ATI Radeon e Nvidia GeForce 2 apareceram, capazes de multi-extensão em uma passagem.

Essas GPUs tinham várias unidades de textura na área de processamento de pixels (ou seja, no pipeline ), portanto, obter um texel com filtragem bilinear de duas texturas separadas se tornou a tarefa mais simples. Isso aumentou ainda mais a popularidade dos mapas de iluminação e permitiu que os jogos os tornassem totalmente dinâmicos, alterando os valores de iluminação dependendo das condições do ambiente de jogo.

Mas com algumas texturas, muito mais poderia ser feito, então vamos explorar suas capacidades.

Para mudar a altura é normal


Nesta série de artigos sobre renderização em 3D, não falamos sobre como o papel da GPU afeta todo o processo (falaremos sobre isso, mas não agora!). Mas se você voltar à parte 1 e ler sobre todo o complexo processo de processamento de vértices, poderá pensar que essa é a parte mais difícil de todo o trabalho que a GPU deve executar.

Durante muito tempo, os programadores de jogos fizeram todo o possível para reduzir essa carga. Eles tiveram que usar todos os tipos de truques para garantir a mesma qualidade de imagem que ao usar vários vértices, mas não os processam.

A maioria desses truques usava texturas chamadas mapas de altura e mapas normais.. Esses dois conceitos estão conectados pelo fato de que o último pode ser criado a partir do primeiro, mas, por enquanto, vejamos apenas uma técnica chamada "mapeamento de resposta" .


Imagens criadas em uma renderização de demonstração por Emil Persson . A textura em relevo é desativada / ativada A textura em relevo

usa uma matriz 2D chamada “mapa de altura” que parece uma versão estranha da textura original. Por exemplo, a imagem acima mostra uma textura de tijolo realista sobreposta em duas superfícies planas. A textura e seu mapa de altura são assim:


As cores do mapa de altura indicam as normais da superfície dos tijolos (descrevemos as normais na parte 1 de uma série de artigos). Quando o processo de renderização atinge o estágio de aplicação da textura de tijolo na superfície, uma série de cálculos é executada para alterar a cor da textura de tijolo com base em suas normais.

Como resultado disso, os tijolos parecem tridimensionais, apesar de continuarem completamente planos. Se você observar atentamente, especialmente nas bordas dos tijolos, poderá ver as limitações dessa técnica: a textura parece levemente distorcida. Mas este é um truque rápido que permite adicionar mais detalhes da superfície, de modo que a texturização em relevo é muito popular.

Um mapa normal é semelhante a um mapa de altura, apenas as cores da textura são as próprias normais. Em outras palavras, cálculos para converter o mapa de altura em normal não são necessários. Você pode fazer uma pergunta: como as cores podem descrever um vetor no espaço? A resposta é simples: cada texel possui um conjunto de valores de r, g, b (vermelho, verde, azul) e esses valores correspondem diretamente aos valores de x, y, z do vetor normal.


O diagrama esquerdo mostra a mudança na direção das normais em uma superfície irregular. Para descrever as mesmas normais com uma textura plana (contorno do meio), atribuímos cores a elas. Nesse caso, usamos os valores r, g, b (0,255.0) para o vetor direcionado para cima e aumentamos o valor de vermelho para inclinação para a esquerda e azul para inclinação para a direita.

Lembre-se de que essa cor não se mistura com o pixel original, simplesmente informa ao processador em qual direção o normal indica, para que possa calcular corretamente os ângulos entre a câmera, as fontes de luz e a superfície texturizada.

As vantagens da texturização em relevo e dos mapas normais são totalmente aparentes quando a iluminação dinâmica é usada na cena e quando o processo de renderização calcula o efeito da alteração da iluminação pixel por pixel, e não para cada vértice. Hoje, os jogos modernos usam um conjunto de texturas para melhorar a qualidade desse truque.


Imagem: Ryan Benno, do Twitter

Surpreendentemente, essa parede de aparência realista é apenas uma superfície plana, os detalhes de tijolos e cimento de alvenaria não são feitos usando milhões de polígonos. Em vez disso, apenas cinco texturas e o uso ponderado dos cálculos são suficientes.

Um mapa de altura foi usado para gerar a projeção de sombras com tijolos, e um mapa normal foi usado para simular todas as pequenas alterações na superfície. A textura da rugosidade foi usada para alterar a maneira como a luz é refletida em vários elementos da parede (por exemplo, o tijolo liso reflete a luz de maneira mais uniforme do que o cimento bruto).

O último cartão, nomeado na imagem AO, cria uma parte do processo chamado oclusão ambiental: examinaremos essa técnica em mais detalhes nos artigos a seguir, mas, por enquanto, digamos que isso ajude a aumentar o realismo das sombras.

O mapeamento de textura é um processo crítico.


A texturização é absolutamente essencial ao desenvolver jogos. Tomemos, por exemplo, o jogo de 2019 Kingdom Come: Deliverance , um RPG em primeira pessoa que se passa na Boêmia no século XV. Os designers procuraram criar o mundo mais realista desse período. E para imergir o jogador na vida há centenas de anos, é melhor implementar uma paisagem historicamente precisa, edifícios, roupas, penteados, itens do dia-a-dia e muito mais.

Cada textura nesta imagem do jogo foi criada manualmente por artistas e também graças a um mecanismo de renderização controlado por programadores. Alguns deles são pequenos, com detalhes simples e, portanto, são ligeiramente filtrados ou processados ​​com outras texturas (por exemplo, asas de galinha).


Outros têm alta resolução e muitos pequenos detalhes; eles passam por filtragem anisotrópica e se misturam com mapas normais e outras texturas - basta olhar para o rosto da pessoa em primeiro plano. A diferença nos requisitos de textura de cada objeto de cena é levada em consideração pelos programadores.

Tudo isso acontece hoje em muitos jogos, porque os jogadores esperam níveis cada vez mais altos de detalhes e realismo. As texturas estão se tornando maiores, e mais e mais delas são sobrepostas na superfície, mas o processo de amostragem de texels e sobreposição de pixels em pixels permanece essencialmente o mesmo dos dias do Quake. As melhores tecnologias nunca morrem, não importa quantos anos tenham!

All Articles