2010-10-06 8 views
5

Bonjour, je suis assez nouveau pour OpenGL. Ma tâche consiste à implémenter les pinceaux GDI dans OpenGL pour dessiner sur MAC OS X. Je me suis donc tourné vers les textures dans OpenGL pour dessiner le motif, puis mapper les primitives de dessin comme un polygone (rectangle a cas au point). Je crée une texture de 8x8 texels, puis je la mappe sur un polygone avec des coordonnées ci-dessous sur une fenêtre de 500x500 pixels.Répétition de textures dans OpenGL

glVertex3f (0,35, 0,35, 0,0);

glVertex3f (0,35, 0,65, 0,0);

glVertex3f (0,65, 0,65, 0,0);

glVertex3f (0,65, 0,35, 0,0);

Depuis que j'ai besoin d'un effet de pinceau, le motif doit être répété le long du rectangle. Le rectangle/carré est de 0,3 x 0,3 et la fenêtre entière est de 500 x 500 puis en termes de pixels du polygone est de 150 x 150.

donc répétitions nécessaires sont 150/8

I donc mis coordonne la texture que suit:

glTexCoord2f(0.0,  0.0); glVertex3f(0.35, 0.35, 0.0); 
glTexCoord2f(0.0,  150/8); glVertex3f(0.35, 0.65, 0.0); 
glTexCoord2f(150/8,  150/8); glVertex3f(0.65, 0.65, 0.0); 
glTexCoord2f(150/8,  0.0); glVertex3f(0.65, 0.35, 0.0); 

J'ai un problème que le motif de hachures vertical (un texel transparent autre couleur) J'ai créé comme une texture n'est pas correctement mis en correspondance dans le sens que certaines lignes verticales deviennent plus larges que d'autres (une sorte de problème d'aliasing). Est-ce comme ça que je dois définir les coordonnées de texture pendant le mapping?

Merci pour toute réponse

al

Répondre

3

Si le code que vous avez écrit est exactement ce que vous avez dans votre code, puis 150/8 est votre problème. Ceci est une division entière et ne retournera pas le virgule flottante 18.75, mais l'entier 18.

Modifiez votre code en valeurs à virgule flottante.

150.f/8.f 
14

Si je vous comprends correctement, vous ne traitez pas les coordonnées de texture correctement. Lorsque vous utilisez glTexCoord2f(), la texture s'étend de 0,0, 0,0 à 1,0, 1,0. Donc, si vous voulez avoir une texture qui remplit un quad vous utilisez les éléments suivants:

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.35f, 0.35f, 0.0f); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.35f, 0.65f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.65f, 0.65f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.65f, 0.35f, 0.0f); 

Et si vous voulez répéter la texture 8 fois sur la surface de l'utilisation de quad 8.0f en place des 1.0fs dans l'appel texCoords. Vous devez également vous assurer que la texture est définie pour se répéter lorsqu'elle est définie une fois que vous avez lié la texture.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

C'est probablement votre problème, mais si vous rencontrez toujours des problèmes d'aliasing, essayez de regarder dans glTexParameteri avec GL_TEXTURE_MAG_FILTER et GL_TEXTURE_MAG_FILTER et mip-mapping.

Il peut être vieux de plus d'une décennie, mais this old Flipcode tutorial est toujours pertinent et vaut le détour.

EDIT: appels vertex Had avant que les appels TexCoord

+0

Comment est-il pas correctement traiter les texcoords? il fait exactement ce que vous suggérez? Et les appels TexCoord viennent avant les appels Vertex. – Bahbar

+0

Il utilise 150/8 au lieu de 8. Bon point sur l'ordre d'appel cependant - je n'ai pas utilisé le mode immédiat depuis des années! – Pike65

+0

merci Bahbar Je venais de réaliser quel était le problème et allait poster la solution. Oui, c'était le problème! Merci quand même – user461426

Questions connexes