2010-09-08 5 views
1

J'ai une texture en cours de dessin sur un quad. La texture est le motif répété dans le coin supérieur gauche de cette capture d'écran: http://img828.imageshack.us/img828/3305/blahpv.png La texture opengl ne fait que 3px par 9px et les coordonnées de texture que je crois sont de très grands nombres et elle boucle sur la texture 3x9 en utilisant GL_REPEAT. Une explication pour le motif d'interférence étrange vu dans la capture d'écran? La texture semble bien (répétant parfaitement) quand le quad est exactement perpendiculaire à la caméra ... la capture d'écran est avec le quad tourné de quelques degrés. Les anomalies semblent changer lorsque le quad change de distance par rapport à la caméra ou lorsque la rotation change, donc je pense que cela a quelque chose à voir avec l'échantillonnage de texture et l'arrondi à virgule flottante, mais je ne sais pas comment le réparer.La texture répétée OpenGL provoque des anomalies lors de la rotation

Mise à jour # 1:

Je n'utilise pas, mais c'est Shaders que je suis en train de faire actuellement en python pour chaque sommet:

(x0, y0, z0) = gluProject(vert[0].x, vert[0].y, 0.0) 
x0 /= maskTextureWidth # 3.0 
y0 /= maskTextureHeight # 9.0 
glMultiTexCoord2f(GL_TEXTURE1_ARB, x0, y0) 
glVertex2f(vert[0].x, vert[0].y) 

Répondre

0

Eh bien, ne connaissant pas la rotation appliquée, nous pouvons seulement supposer qu'il s'agit d'un type de moiré se formant à peine (où les grilles interférentes sont votre texture et la grille de rasterisation). Pourquoi appelez-vous cette anomalie (ou plus au point, que voulez-vous en conséquence)?

Si tout ce que vous voulez est quelque chose qui semble juste mieux, je suggérerais d'activer le filtrage trilinéaire sur votre texture.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
+0

Malheureusement, l'utilisation de GL_LINEAR ou de tout mipmapping signifie que le masque va devenir flou. J'ai vraiment besoin que chaque texel du masque corresponde à un seul pixel sur l'écran. Comme ceci: http://img101.imageshack.us/img101/6499/30831346.png L'image de gauche montre le masque sur l'ensemble de l'écran et le contour du quad que j'essaie de dessiner. L'image de droite montre à quoi doit ressembler l'écran après avoir dessiné un quad blanc (qui a été mélangé avec le masque). – bparker

0

Ok, alors qu'est-ce que vous faites pour faire pivoter le quad, mais pas la texture, non?

Vous pouvez le faire facilement dans vos shaders (certaines parties sont manquantes, comme la déclaration d'échantillonnage)

Vertex shader:

out vec2 UV; 
main(){ 
    gl_Position = MVP * Position; 
    UV = gl_Position.xy/gl_Position.w; 
} 

Fragment shaders:

in vec2 UV; 
main(){ 
    outColor = texture(sampler, UV); 
} 

De plus, vous n'avez même pas à fournir de coordonnées de texture: elles sont calculées au moment de l'exécution.

Une autre possibilité, moins invasive si vous n'avez pas de shaders, est de recalculer vos UV de la même manière que dans le vertex shader.

Une autre possibilité est glBitmap, mais cela est une très vieux morceau de l'API ...

+0

Voir mise à jour # 1 dans le message, ne pas utiliser les shaders. Mon exemple correspond-il à ce que vous pensez qu'il devrait fonctionner? – bparker

+0

Ok, désolé, mais cela ne change rien. Si vous acceptez de pré-traiter chaque vertex de chaque frame sur le CPU, cela équivaut à exécuter le vertex shader que je vous ai donné. Donc gl_Position = ... sera exécuté de toute façon avec le pipeline de fonctionnalité fixe, il suffit de mettre à jour le buffer des coordonnées UV. – Calvin1602

+0

@bparker: voir l'autre réponse – Calvin1602