Hay dos causas posibles para este tipo de problema, dependiendo exactamente de qué problema se trata. Voy a enumerar ambos:
1. Usted está viendo otros colores de su textura a lo largo de los bordes de las baldosas.
Esto me parece el problema en este caso, porque todos los píxeles del borde son uno de los tres colores que son plausiblemente en su textura: blanco, negro y marrón.
Si está utilizando múltiples imágenes de mosaico una al lado de la otra en una sola textura (un atlas de texturas), como supongo que está haciendo, esto es inevitable. Ocurre porque la GPU no combina perfectamente la interpolación a lo largo del borde de un triángulo con la interpolación a lo largo de la textura, y se obtienen pequeños fragmentos de la textura adyacente.
Hay varias cosas que puedes hacer.
- Use una textura de matriz en lugar de un atlas de texturas. Una textura de matriz se compone de una pila de imágenes 2D del mismo tamaño, y usted especifica una tercera coordenada para seleccionar una; está destinado exactamente como un reemplazo para los atlas de textura sin el problema de filtrado. Sin embargo, las texturas de matriz son una característica más nueva que puede no estar disponible en la versión de OpenGL que está utilizando.
- Genere un borde de 1 píxel en cada uno de sus mosaicos de textura, que replica el color del píxel regular adyacente. (Esto esencialmente está reimplementando los GL
CLAMP[_TO_EDGE]
, pero de una manera que tiene en cuenta los atlas de texturas; su uso de los mismos no tiene ningún efecto porque la mayoría de los bordes de su mosaico no están en el borde de la textura). Esta es la solución que uso en mi propia entrada en el género, cubos . No conozco ninguna desventaja particular, excepto que usa más memoria de textura.
- Inserta muy ligeramente tus coordenadas de textura, para que no lleguen hasta el borde del mosaico de textura. Hacer esto demasiado conducirá a una notable delgadez de los bordes de la textura en comparación con los píxeles en el medio.
- Use una sola textura por tipo de mosaico. Esto impone costos de cambio de textura.
2. Estás viendo a través de los espacios entre las fichas.
No creo que este sea el problema en este caso, ya que no se ve un terreno verde a través de los huecos, pero lo estoy incluyendo por completo.
Esto puede ocurrir cuando no proporciona exactamente las mismas coordenadas para los vértices de los bordes de reunión de los mosaicos adyacentes, lo que generalmente surge debido a un error de punto flotante. Por ejemplo, si tiene mosaicos de tamaño 0.6 y calcula el borde derecho del mosaico en x=100
con (100*0.6) + 0.6
, y el borde izquierdo del mosaico en x=101
con (100*0.6)
, no obtendrá la misma respuesta exacta, y la diferencia puede ser visible como pequeñas manchas de brechas.
La solución es asegurar que su aritmética sea consistente; Algunas formas de hacer esto son:
- Asegúrese de no estar (ni siquiera indirectamente) computando
index*size + size
, sino solo (index+1)*size
.
- Asegúrese de que su aritmética sea exacta; La forma más fácil de hacer esto es hacer que el tamaño de su mosaico sea exactamente 1.0, lo que resultará en una aritmética de enteros exactos incluso si realiza sus cálculos con flotantes de 32 bits (de todos modos, hasta 16 millones de bloques desde el origen).
- Use enteros reales para los cálculos de coordenadas de vértice; esto te da aún más alcance.