Tengo un motor de juego 2D que dibuja mapas de mosaicos dibujando mosaicos de una imagen de conjunto de mosaicos. Debido a que, por defecto, OpenGL solo puede envolver toda la textura ( GL_REPEAT
), y no solo una parte, cada mosaico se divide en una textura separada. Luego, las regiones del mismo mosaico se vuelven adyacentes entre sí. Así es como se ve cuando funciona según lo previsto:
Sin embargo, tan pronto como introduzca la escala fraccional, aparecerán las costuras:
¿Por qué pasó esto? Pensé que se debía al filtrado lineal que mezclaba los bordes de los quads, pero aún sucede con el filtrado de puntos. La única solución que he encontrado hasta ahora es asegurar que todo el posicionamiento y la escala solo ocurran en valores enteros, y usar el filtrado de puntos. Esto puede degradar la calidad visual del juego (particularmente que el posicionamiento de subpíxeles ya no funciona, por lo que el movimiento no es tan suave).
Cosas que he probado / considerado:
- antialiasing reduce, pero no elimina por completo, las costuras
- desactivar mipmapping, no tiene efecto
- renderice cada mosaico individualmente y extruya los bordes en 1px, pero esto es una des-optimización, ya que ya no puede procesar regiones de mosaicos de una sola vez, y crea otros artefactos a lo largo de los bordes de las áreas de transparencia
- agregue un borde de 1px alrededor de las imágenes de origen y repita los últimos píxeles, pero ya no son la potencia de dos, causando problemas de compatibilidad con sistemas sin soporte NPOT
- escribir un sombreador personalizado para manejar imágenes en mosaico, pero entonces, ¿qué haría diferente?
GL_REPEAT
debe tomar el píxel desde el lado opuesto de la imagen en los bordes, y no elegir la transparencia. - la geometría es exactamente adyacente, no hay errores de redondeo de coma flotante.
- Si el sombreador de fragmentos está codificado para devolver el mismo color, las costuras desaparecerán .
- si las texturas se establecen en
GL_CLAMP
lugar deGL_REPEAT
, las costuras desaparecen (aunque el renderizado es incorrecto). - si las texturas están configuradas en
GL_MIRRORED_REPEAT
, las costuras desaparecen (aunque el renderizado vuelve a ser incorrecto). - Si hago el fondo rojo, las costuras siguen siendo blancas. Esto sugiere que está muestreando blanco opaco de algún lugar en lugar de transparencia.
Por lo tanto, las costuras aparecen solo cuando GL_REPEAT
está configurado. Por alguna razón solo en este modo, en los bordes de la geometría hay algo de sangrado / fuga / transparencia. ¿Como puede ser? Toda la textura es opaca.
GL_NEAREST
muestreo en la R
dirección de coordenadas también funcionan tan bien como las texturas de matriz para la mayoría de las cosas en este escenario. Mipmapping no va a funcionar, pero a juzgar por su aplicación, probablemente no necesite mipmaps de todos modos.