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:
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);
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);
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.
fuente
GL_CLAMP_TO_EDGE
conjunto, 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.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.
fuente
Este es un problema habitual con los mapas de cubos en HW más antiguos (o iphones tal vez). Comprueba el
extensión si está disponible en su hw. Si es así. El problema se resolverá de manera propagable al usarlo.
fuente
¿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.
fuente