Traduções de sub-pixel de rasterização 2D do OpenGL

7

Eu tenho um mecanismo 2D baseado em ladrilhos, onde a matriz de projeção é uma visão ortográfica do mundo sem nenhuma escala aplicada. Assim: uma textura de pixel é desenhada na tela no mesmo tamanho.

Tudo funciona bem e fica bonito, mas se a câmera fizer um movimento sub-pixel, pequenas linhas aparecerão entre os blocos. Posso lhe dizer com antecedência o que não resolve o problema:

  • GL_NEAREST interpolação de texturas
  • GL_CLAMP_TO_EDGE

O que "corrige" o problema é ancorar a câmera no pixel mais próximo, em vez de fazer uma conversão de subpixels. Eu posso viver com isso, mas o movimento da câmera se torna instável. Alguma idéia de como resolver esse problema sem recorrer ao truque de arredondamento que eu faço atualmente?

Armin Ronacher
fonte
Você está por acaso armazenando várias texturas de ladrilhos em uma grande textura? Lembro-me de ter um problema semelhante e foi causado pelo processamento de pixels do OpenGL a partir da textura adjacente do bloco. Como eu o resolvi no final foi mover cada peça para sua própria textura. Já faz um tempo, porém, não tenho certeza se o problema aconteceu GL_NEARESTou apenas com ele GL_LINEAR.
Re
Sim, mas nenhuma das soluções propostas para esse problema específico (GL_NEAREST) ​​ajuda o mínimo. Além disso, os erros de arredondamento nas texturas significam que eu vejo pixels vizinhos, mas o que vejo é o plano de fundo do sprite, o que me leva à ideia de que esse pode ser um problema geral de rasterização.
Armin Ronacher

Respostas:

1

Para evitar o estremecimento da câmera, você deve manter a câmera de coordenadas de ponto flutuante, mas prenda a projeção do OpenGL no pixel mais próximo.

sam hocevar
fonte
Como isso funciona? A matriz de projeção é configurada apenas uma vez como um projeto ortográfico, nenhuma alteração nos quadros é aplicada a ela.
Armin Ronacher
Desculpe, eu percebo que não estou sendo clara. Eu quis dizer que você deve tentar ajustar as matrizes de exibição e projeção para que elas fiquem fixadas no pixel mais próximo, mas não salve esses valores fixados nos parâmetros da câmera, ou você acumulará erro e causará instabilidade. Se já é isso que você está fazendo e a câmera ainda está tremendo, precisamos saber mais sobre seus gráficos: é pixel art ou desenhos sombreados? Qual o tamanho dos seus modelos?
Sam Hocevar
É um jogo de plataformas 2D. Agora, estou fixando a renderização em pixels, o que funciona bem. Se eu tirar a imagem final e usar o photoshop para mover a imagem para qualquer quantidade de subpíxeis para o topo da base, obtenho exatamente o que quero -> movimento suave. Eu posso fazer isso no OGL se renderizar para um FB e depois traduzir isso. Se eu fizer isso com a matriz modelview, serão exibidas lacunas entre os blocos.
Armin Ronacher
Você também está arredondando suas coordenadas de objetos do mundo antes de enviá-las para o OGL também? Faço exatamente isso em um jogo isométrico e funciona bem.
Sam Hocevar
0

Você pode ver esta postagem do blog sobre o uso em doublevez de floatpara matrizes OpenGL. Eu tive problemas semelhantes no PC usando o OpenGL, por isso não é específico para iPhone / OpenGL ES, embora a postagem do blog mencione o OpenGL ES no iPhone.

jv42
fonte
Poderia o eleitor de down pelo menos explicar sua votação de down? Minha resposta é informativa e sugiro uma solução para o problema do OP.
jv42
0

Pode ser que, ao calcular as coordenadas dos cantos de cada bloco, você esteja perdendo alguma precisão. Portanto, por exemplo, você acha que o vértice inferior direito do bloco 0 está exatamente no mesmo local que o vértice inferior esquerdo do bloco 1, mas na verdade não é. Uma idéia para corrigi-lo seria calcular uma grade temporária de coordenadas no início e, em seguida, copiar a posição apropriada ao construir a geometria do bloco. Isso faz sentido?

DaleyPaley
fonte