J'ai un problème étrange avec le dessin de la texture skybox sur Mac. Sur iPhone, tout va bien. J'ai essayé de changer la valeur des avions proches et lointains sans succès.
Il s'agit d'une skybox de six textures, et pour chaque texture, j'ai défini ceci:
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);
Quel pourrait être le problème?
Capture d'écran:
ÉDITER:
J'ai essayé de définir la couleur d'arrière-plan sur rouge, pour m'assurer qu'elle saigne à travers la texture
J'ai également essayé de changer les coordonnées de la texture en ceci:
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,
};
Et la boîte est dessinée dans cet ordre:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};
SOLUTION:
La solution consiste à définir GL_CLAMP_TO_EDGE pour le cubemap lui-même!
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);
etglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
insérez '0.5f / texture_width' du côté gauche et droit de la texture et '0.5f / texture_height' du haut et du bas. Vous voyez des artefacts d'échantillonnage - les échantillonneurs de texture échantillonnent généralement au centre des texels, donc à gauche et à droite, en haut et en bas (à 0 et 1 uv), vous obtenez 50% du texel que votre échantillonneur obtient lorsqu'il est hors limites . Il s'agit de l'autre côté de la texture ou d'une couleur d'échantillonnage par défaut.
la source
GL_CLAMP_TO_EDGE
ensemble, il devrait faire en sorte que les échantillons hors limites prennent la valeur des pixels de texture les plus proches. Ce que vous décrivez peut très bien fonctionner, mais cela n'explique pas pourquoi le problème existe en premier lieu.Ma meilleure supposition est que la différence entre MAC et iPhone est causée par l'anticrénelage sur le MAC. Ma programmation 3D est un peu rouillée, mais je suppose que vous devriez faire tous les carrés du même maillage ou quelque chose comme ça.
Une solution de hack sale serait de rendre tous les carrés un peu trop gros pour qu'ils se chevauchent et se clipsent et ajustent les coordonnées UV en conséquence.
la source
C'est un problème habituel avec les cubemaps sur les anciens HW (ou les iphones peut-être). Vérifiez la
extension si elle est disponible sur votre HW. Si c'est le cas. Le problème sera correctement résolu en l'utilisant.
la source
Les six textures sont-elles configurées spécifiquement comme une carte cubique ou chacune des faces de la skybox est-elle rendue séparément avec sa propre texture? J'ai entendu dire que certains des premiers systèmes PC avaient un filtrage plutôt médiocre en ce qui concerne la gestion des cubemaps, car ils ne filtraient pas nécessairement entre les textures d'une face à l'autre lorsque vous échantillonniez près des bords du cube. AFAIK le SGX (iphone GPU) devrait filtrer correctement sur les bords.
Il m'est venu à l'esprit que le bas de vos textures latérales semble être une nuance de bleu similaire à l'artefact. Pourriez-vous essayer, par exemple, de faire de la rangée inférieure (ou de quelques rangées) de pixels une nuance hideuse de magenta et voir si cela change la couleur de l'artefact? Cela pourrait donner une idée plus précise de ce qui peut ou non se produire.
la source