Filtragem Bilinear e Interpolação Bilinear
Dê uma olhada na foto abaixo. É possível calcular os valores nos pontos A,B e C?
Há uma técnica para fazer isto chamada interpolação bilinear que estende a ideia de interpolação linear em duas dimensões.
Para calcular a interpolação bilinear, basta fazer a interpolação linear num eixo, e depois no outro.
Cheque estes exemplos:
Ponto A
Ponto A tem uma coordenada de (0,2,0,8). Vamos começar com o eixo X.
Primeiro, vamos fazer interpolação através do topo do quadrado no eixo X. Isso significa que precisamos ir de 0,2 (20%) do caminho de 7 a 0. Essa 0,2 é a nossa coordenada do eixo X. Para calcular isso:
7 + (0-7) * 0,2 = 5,6
Próximo, faremos a interpolação através da parte inferior do quadrado no eixo X. Tão semelhante ao acima, iremos 0,2 (20%) do caminho de 3 a 5. Para calcular isso:
3 + (5-3) * 0,2 = 3,4
Agora interpolamos através do nosso eixo X, precisamos interpolar através do nosso eixo Y. Agora vamos 0,8 (80%) do caminho do nosso valor inferior (o valor de Y = 0), para o nosso valor superior (o valor de Y = 1). O valor inferior é a interpolação inferior que fizemos (3,4) e o valor superior é a interpolação superior que fizemos (5,6).
Então, precisamos ir 0,8 (80%) do caminho de 3,4 a 5,6. Para calcular isso:
3,4 + (5,6 – 3,4) * 0,8 = 5,16
Então, o valor no ponto A é 5,16. A imagem abaixo deve ajudar a explicar visualmente o processo pelo qual passamos.
Ponto B
Ponto B tem uma coordenada de (1.0,0.5).
Vamos começar com a interpolação do eixo X novamente (embora você poderia facilmente começar com Y primeiro se quisesse! Você acabaria com o mesmo resultado).
Fazendo a interpolação do eixo X através do topo, precisamos ir 1,0 (100%) do caminho de 7 a 0. Tenho certeza que você pode adivinhar qual é a resposta, mas aqui é calculado:
7 + (0-7) * 1,0 = 0
Simplesmente, vamos fazer a interpolação do eixo X através do fundo. Precisamos ir 1,0 (100%) do caminho de 3 a 5,
3 + (5-3) * 1,0 = 5
Próximo vem a interpolação do eixo Y. Precisamos ir 0,5 (50%) do caminho de 5 a 0,
5 + (0-5) * 0,5 = 2,5
Aqui vamos nós, o valor no ponto B é 2,5. Isso também deve fazer sentido ao olhar para o diagrama. É basicamente uma interpolação linear 1d entre 5 e 0, e está a meio caminho entre eles, portanto intuitivamente, a resposta 2,5 deve fazer sentido.
Ponto C
Ponto C tem uma coordenada de (0,8,0,2).
Até novamente, vamos fazer a interpolação do eixo X através do topo da caixa. Precisamos de ir 0,8 (80%) do caminho de 7 a 0,
7 + (0-7) * 0,8 = 1,4
Então, precisamos de fazer a interpolação do eixo X através da parte inferior da caixa. Precisamos ir 0,8 (80%) do caminho de 3 a 5,
3 + (5-3) * 0,8 = 4,6
Próxima interpolação do eixo y. Precisamos ir 0,2 (20%) de 4,6 para 1,4,
4,6 + (1,4-4,6) * 0,2 = 3,96
O valor do ponto C é 3.96
Filtragem bilinear
Embora a interpolação bilinear seja útil se você tiver uma grade de dados que você quer interpolar valores dentro (como um campo de altura que representa o terreno?!), onde isso realmente brilha no desenvolvimento do jogo é na filtragem de textura bilinear.
Basicamente, quando você tem uma coordenada de textura que não se alinha perfeitamente com o centro de um pixel na textura (porque há um resto), ele usa a parte fracional da coordenada dentro desse pixel para fazer interpolação bilinear entre os 4 pixels envolvidos para chegar à cor final do pixel. Ele faz interpolação bilinear em cada um dos canais: Vermelho, Verde, Azul e Alfa.
O resultado final é muito bom! Confira a imagem abaixo para vê-la em ação em uma textura que estamos ampliando demais. O lado esquerdo usa filtragem bilinear, enquanto o lado direito não, e mostra apenas o pixel mais próximo.
Consequentemente, a filtragem de textura bilinear tem que fazer uma leitura de 4 pixels para poder interpolar entre eles, ao invés de uma leitura de um único pixel como quando se faz uma amostragem de pixels mais próxima. Mais leituras de pixels = mais overhead, e não tão baratas (computacionalmente) para usar.
Links
Para algumas pessoas que estão lendo isto, esta informação é bastante básica e você pode estar se perguntando porque eu me dei ao trabalho de escrever sobre isto. Olhe para o próximo post para algo meio bizarro em relação à filtragem bilinear. Isto foi necessário como um trampolim para a próxima coisa que eu quero mostrar a vocês 😛
Wikipedia: Interpolação Linear
Wikipedia: Interpolação Bilinear
Wikipédia: Filtragem Bilinear
O Lado Negro da Filtragem Bilinear
Cheque estes links para mais informações sobre algumas falhas (e algumas soluções) de amostragem bilinear baseada em hardware:
iq: interpolação de hardware
iq: interpolação de textura melhorada
Leave a Reply