OpenGL - bordes blancos en cubos

12

En un juego similar a Minecraft que estoy haciendo, obtengo bordes blancos en mis cubos:

ingrese la descripción de la imagen aquí

Es mucho más notable en texturas más oscuras. Las texturas se configuran así: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

¿Alguna ayuda?

Luis cruz
fuente
3
¿Puedes mostrar algún código sobre cómo renderizas cada cubo y cómo colocas los cubos?
joncodo
1
¿Ajustar las texturas hace algo diferente? ¿Cómo se ve la textura / tamaño al que se está uniendo?
Chuck D
Solo quería señalar que he visto que esto también tiene lugar en atlas de texturas grandes, que usan mosaicos pequeños. Como ejemplo, supongamos que tiene un conjunto de fichas / atlas 1024 * 1024, y está utilizando fichas de 32 * 32. Obtiene errores de redondeo porque el punto decimal que se asigna a dicho mosaico es un doble muy pequeño. Esto hace que la precisión sea casi imposible. ¿Una solución? Divide el atlas de fichas en fichas individuales. Esto es lo que hace Minecraft, o solía hacer. Tenían un gran conjunto de fichas, y en tiempo de ejecución lo dividieron en texturas individuales.
Krythic

Respuestas:

19

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=100con (100*0.6) + 0.6, y el borde izquierdo del mosaico en x=101con (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.
Kevin Reid
fuente
A mí me parecen huecos, sin sangrado de textura (a menos que sea una textura de alta resolución) teniendo en cuenta los bits pequeños y afilados.
Mario
Gracias, insertar un poco las coordenadas de textura parece arreglarlo.
Luis Cruz
@ Mario Supongo que esto es con un aumento MÁS CERCANO: tenga en cuenta el borde afilado en el interior de la baldosa. Entonces, para esa perspectiva, es una textura de resolución infinita.
Kevin Reid
También puede usar una matriz de texturas para evitar costos de cambio.
danijar