Artefacto de textura Skybox en el borde


12

Tengo un extraño problema con el dibujo de la textura de Skybox en Mac. En iPhone todo va bien. He tratado de cambiar el valor de los planos cercanos y lejanos sin éxito.

Es un skybox de seis texturas, y para cada textura configuro esto:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

¿Cual podría ser el problema?

Captura de pantalla:

Imagen del cielo con los bordes del skybox visible

EDITAR:

He tratado de establecer el color de fondo en rojo, para asegurarme de que esté sangrando por la textura.

También he tratado de cambiar las coordenadas de la textura a esto:

float err_corr = 0.5 / TEXTURE_SIZE;

GLfloat vertices[24] = {    
        -1.0f - err_corr, -1.0f - err_corr,  1.0f + err_corr,
    1.0f + err_corr, -1.0f - err_corr,  1.0f + err_corr,
    -1.0f - err_corr,  1.0f + err_corr,  1.0f + err_corr,
    1.0f + err_corr,  1.0f + err_corr,  1.0f + err_corr,
    -1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
    1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
    -1.0f - err_corr,  1.0f + err_corr, -1.0f - err_corr,
    1.0f + err_corr,  1.0f + err_corr, -1.0f - err_corr,
    };

Y el cuadro se dibuja en este orden:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

SOLUCIÓN:

¡La solución es establecer GL_CLAMP_TO_EDGE para el propio mapa de cubos!

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Respuestas:


8

¿Estás seguro de que has establecido GL_CLAMP_TO_EDGE para cada textura individual ? Esto es parte del estado de textura individual y su valor predeterminado es GL_REPEAT, por lo que esto debe hacerse después de la unión con glBindTexture. Me doy cuenta de que en la publicación original literalmente dice que lo configuró para cada textura, pero me pregunto cómo se ve realmente el código.

Por ejemplo:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.

Esto no es lo mismo que:

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

¡He encontrado el error! ¡Era necesario no establecer GL_CLAMP_TO_EDGE para cada textura del mapa de cubos, sino para la propia aplicación de cubos! glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);yglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
martin pilch

1

inserte '0.5f / texture_width' desde el lado izquierdo y derecho de la textura y '0.5f / texture_height' desde arriba y abajo. Estás viendo muestras de artefactos: los muestreadores de textura generalmente toman muestras del centro de los texels, por lo que a la izquierda y a la derecha, arriba y abajo (a 0 y 1 uv) obtienes el 50% del texel que obtiene tu muestra cuando está fuera de los límites . Ese es el otro lado de la textura o un color de muestreo predeterminado.


Es por eso que tiene el GL_CLAMP_TO_EDGEconjunto, debería hacer que las muestras fuera de los límites tomen el valor de los píxeles de textura más cercanos. Lo que describe puede funcionar muy bien, pero no explica por qué el problema está ahí en primer lugar.
aaaaaaaaaaaa

Lo he intentado sin cambios: /
martin pilch 05 de

0

Mi mejor conjetura es que la diferencia entre MAC y iPhone es causada por el antialiasing en el MAC. Mi programación 3D está un poco oxidada, pero supongo que tendrías que hacer que todos los cuadrados sean parte de la misma malla o algo así.

La solución de pirateo sucio sería hacer que todos los cuadrados sean demasiado grandes para que se superpongan y se abrochen entre sí y ajusten las coordenadas UV en consecuencia.


He intentado desactivar el suavizado (por glDisable (GL_POLYGON_SMOOTH);) sin ningún efecto. Estoy dibujando skybox como una franja triangular con las coordenadas de -1 a 1
martin pilch

1
Suena bien para mi. Al menos por ahora estoy sin adivinanzas, pero es posible que desee reducir el problema descubriendo si ese negro es el fondo que se filtra o el borde de la textura que se muestra como negro. Si coloca un polígono rojo en algún lugar detrás del artefacto, ¿el artefacto tomará su color?
aaaaaaaaaaaa

Quiero intentar extender los muros, para que se superpongan (tal como escribió eBusiness). Creo que 0.0001 sería suficiente. No tienes que cambiar las coordenadas UV.
zacharmarz

1/10000 ciertamente no es suficiente, la magnitud del problema parece estar en el rango de 1/4 a 1/2 píxel, por lo que dependiendo del tamaño de la textura, la magnitud mínima para que esto funcione sería alrededor de 1/1000. No ajustar las coordenadas UV es un poco descuidado, dada la naturaleza de la textura, el salto visual resultante puede no ser notable, pero aún así sería incorrecto. En cualquier caso, los consejos adicionales para los hacks deberían depender de la respuesta a la pregunta que hice en mi comentario anterior.
aaaaaaaaaaaa

El artefacto no es un fondo sangrando a través de la textura. He establecido el color de fondo en rojo sin cambios. También he tratado de extender las coordenadas de textura
martin pilch 05 de

0

Este es un problema habitual con los mapas de cubos en HW más antiguos (o iphones tal vez). Comprueba el

GL_ARB_seamless_cube_map

extensión si está disponible en su hw. Si es así. El problema se resolverá de manera propagable al usarlo.


El problema está en GeForce 9400M, no en el iPhone. Esta extensión no está disponible para mí.
Martin Pilch 05 de

Esto definitivamente NO es un problema causado por cubemaps, independientemente de que sea perfecto o no. Este es un problema de envoltura de textura.
Tara

0

¿Las seis texturas están configuradas, específicamente, como un mapa de cubos o cada una de las caras del skybox se representa por separado con su propia textura? Escuché que algunos de los primeros sistemas de PC tenían un filtrado bastante pobre cuando se trataba de manejar mapas de cubos, ya que no necesariamente filtraban a través de la textura de una cara a la siguiente cuando tomaba muestras cerca de los bordes del cubo. AFAIK the SGX (iphone GPU) debe filtrar los bordes correctamente.

Se me ocurrió que la parte inferior de las texturas laterales parece tener un tono azul similar al del artefacto. ¿Podría intentar, digamos, hacer que la fila inferior (o algunas filas) de píxeles tenga un tono magenta horrible y ver si eso cambia el color del artefacto? Eso podría dar una idea más de lo que puede o no estar sucediendo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.