Artefact de texture Skybox sur le bord

12

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:

Image du ciel avec les bords de la skybox visibles

É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);
martin pilch
la source

Réponses:

8

Êtes-vous certain d'avoir défini GL_CLAMP_TO_EDGE pour chaque texture individuelle ? Ceci fait partie de l'état de texture individuel et il est par défaut GL_REPEAT, donc cela doit être fait après la liaison avec glBindTexture. Je me rends compte que dans le message d'origine, vous dites littéralement que vous l'avez défini pour chaque texture, mais je me demande à quoi ressemble le code?

Par exemple:

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.

Ce n'est pas la même chose 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);
user_123abc
la source
J'ai trouvé l'erreur! Il était nécessaire de ne pas définir GL_CLAMP_TO_EDGE pour chaque texture de la carte du cube mais pour la cubemapp elle-même! 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);
martin pilch
1

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.

Luther
la source
C'est pourquoi il a obtenu l' GL_CLAMP_TO_EDGEensemble, 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.
aaaaaaaaaaaa
Je l'ai essayé sans changement: /
martin pilch
0

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.

aaaaaaaaaaaa
la source
J'ai essayé de désactiver l'anti-aliasing (par glDisable (GL_POLYGON_SMOOTH);) sans effet. Je dessine la Skybox sous forme de bande triangulaire avec les coordonnées de -1 à 1
Martin Pilch
1
Sa sonne bien pour moi. Au moins pour l'instant, je suis hors de suppositions, mais vous voudrez peut-être réduire le problème en découvrant si ce noir est le fond qui saigne ou si le bord de la texture est noir. Si vous placez un polygone rouge quelque part derrière l'artefact, l'artefact prendra-t-il sa couleur?
aaaaaaaaaaaa
Je veux essayer d'étendre les murs, afin qu'ils se chevauchent (comme l'a écrit eBusiness) - je pense que 0,0001 serait suffisant. Vous n'avez pas besoin de modifier les coordonnées UV.
zacharmarz
1/10000 n'est certainement pas suffisant, l'ampleur du problème semble être de l'ordre de 1/4 à 1/2 pixel, donc selon la taille de la texture, l'amplitude minimale pour que cela fonctionne soit d'environ 1/1000. Ne pas ajuster les coordonnées UV est un peu bâclé, étant donné la nature de la texture, le saut visuel résultant peut ne pas être perceptible, mais ce serait toujours faux. Dans tous les cas, les conseils supplémentaires pour les hacks devraient dépendre de la réponse à la question que j'ai posée dans mon commentaire précédent.
aaaaaaaaaaaa
L'artefact n'est pas un arrière-plan qui saigne à travers la texture. J'ai défini la couleur d'arrière-plan sur rouge sans changement. J'ai également essayé d'étendre les coordonnées de texture
Martin Pilch
0

C'est un problème habituel avec les cubemaps sur les anciens HW (ou les iphones peut-être). Vérifiez la

GL_ARB_seamless_cube_map

extension si elle est disponible sur votre HW. Si c'est le cas. Le problème sera correctement résolu en l'utilisant.

Notabene
la source
Le problème est sur GeForce 9400M, pas sur l'iPhone. Cette extension n'est pas disponible pour moi.
martin pilch
Ce n'est certainement PAS un problème causé par les cubemaps, qu'ils soient transparents ou non. Il s'agit d'un problème d'emballage de texture.
Tara
0

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.

Simon F
la source