2017-04-01 1 views
-1

J'ai créé un fragment de fragment qui colle une texture (il s'agit en fait d'un tableau de texture, comme vous le verrez dans le code). Cependant, j'obtiens des bordures de 1 pixel très moche autour de chacune des tuiles. Je sais que cela peut être causé par la discontinuité de la fonction, provoquant des choses étranges à se produire pendant le mipmapping, mais j'ai le mipmapping désactivé (bien que j'utilise antialiasing). Voici mon code:Comment se débarrasser des bordures de mosaïque lorsque le Mipmapping est désactivé

vec2 tiledCoords = fract(pass_textureCoords * 256.0)/4.0; // pass_textureCoords are the texture coordinates 

out_Color = texture(testArray, vec3(tiledCoords.x, tiledCoords.y, 0)); // testArray is the sampler2DArray 

Je pensais que je devais donner un peu de tolérance pour les erreurs d'arrondi, mais je ne peux pas à comprendre où mettre ça. Comment puis-je me débarrasser de ces bordures laides? Merci d'avance!

Voici une capture d'écran: Ugly lines

+0

Quels sont les paramètres de texture définis? En ce qui concerne les modes de bouclage et les filtres. – pleluron

+0

@pleluron Aucun mode ou filtre d'habillage. J'ai chargé les textures régulièrement en utilisant 'glTexSubImage3D' (puisque c'est un tableau) et j'ai simplement lié la texture avant le rendu. –

+0

utilisez-vous aussi 'GL_CLAMP_TO_EDGE'? si ce n'est pas le cas (comme le suggère votre commentaire), les coordonnées de texture '0.0' et' 1.0' sont en dehors de votre texture et vous frappez la bordure qui est noire. vous devez décaler d'un texel donc si votre texture est '256x256' alors les coordonnées devraient être dans l'intervalle' <1/256, 255/256> 'au lieu de' <0.0 , 1.0> ' – Spektre

Répondre

2

Je ne suis pas sûr de ce que vous essayez de faire avec les calculs dans votre code. La première ligne ne semble pas contribuer du tout au résultat (elle est écrasée dans la deuxième ligne). Comme vous n'avez pas défini les modes de filtrage ou les modes d'habillage, les paramètres par défaut sont activés, à savoir le filtrage linéaire et le mode répétition.

Il semble que vous utilisiez des tiledCoords dans la plage de [0, 0.25] et que vous essayiez d'envelopper de 0.25 à 0. Le filtrage linéaire ne fonctionnera pas automatiquement dans ce cas puisqu'il n'y a pas de mode automatique pour les 0.25 -> 0 transition. Les lignes noires sont dues à l'interpolation linéaire dans la plage [0, 1/(2 * num_pixels)] car cette zone interpole linéairement entre le 0ème texel et le "-1st" texel (qui est dû au mode enveloppement le dernier texel de votre texture). La même chose se produit pour la plage [0.25 - 1/(2 * num_pixels), 0.25] où vous interpolez le pixel directement à gauche de la coordonnée de texture 0.25 avec le texel à droite.

Il n'existe aucun moyen d'obtenir une interpolation linéaire matérielle pour votre scénario. Vous pouvez utiliser l'échantillonnage du plus proche voisin ou calculer l'interpolation linéaire manuellement.