2010-10-06 20 views
5

Ciao, sono abbastanza nuovo per OpenGL.Ripetizione trame in OpenGL

Il mio compito è quello di implementare i pennelli GDI in OpenGL per disegnare su MAC OS X. Così ho girato su textures in OpenGL per disegnare il pattern e quindi questo deve essere mappato a primitive di disegno come un poligono (rettangolo a caso in questione). Sto creando una texture texels 8x8 e quindi la mappo su un poligono con coordinate in basso su una finestra di 500x500 pixel.

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);

Da quando ho bisogno di un effetto pennello, il motivo deve essere ripetuto lungo il rettangolo. Il rettangolo/quadrato è 0,3 x 0,3 e l'intera finestra è 500 x 500 quindi in termini di pixel del poligono è 150 x 150.

quindi ripetizioni sono richiesti 150/8

pertanto impostare la grana coordinate come segue:

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); 

sto avendo un problema che il tratteggio verticale (uno texel trasparente l'altro colore) modello ho creato dal tessuto non viene adeguatamente mappato nel senso che alcune linee verticali sono sempre più ampia di altri (una sorta di problema di aliasing). È così che devo impostare le coordinate della texture durante la mappatura?

Grazie per le eventuali risposte

al

risposta

3

Se il codice che hai scritto è esattamente quello che avete nel vostro codice, quindi 150/8 è il vostro problema. Questa è una divisione intera e non restituirà il punto mobile 18.75, ma il numero intero 18.

Modificare il codice in valori in virgola mobile.

150.f/8.f 
14

Se sto comprendendo correttamente, non stai trattando correttamente le coordinate della trama. Quando si utilizza glTexCoord2f(), la trama si estende da 0,0, 0,0 a 1,0, 1,0. Quindi, se si vuole avere una texture che riempie un quad si utilizza la seguente:

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); 

E se si desidera ripetere la texture 8 volte su tutta la superficie del 8.0f utilizzo quad al posto dei 1.0fs in la chiamata texCoords. Dovrai anche assicurarti che la texture sia impostata per la ripetizione quando è impostata una volta che hai rilegato la texture.

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

Questo è probabilmente il vostro problema, ma se hai ancora problemi di aliasing, prova a guardare in glTexParameteri con GL_TEXTURE_MAG_FILTER e GL_TEXTURE_MAG_FILTER e MIP-mapping.

Potrebbe essere più vecchio di un decennio, ma this old Flipcode tutorial è ancora pertinente e vale la pena dare un'occhiata.

EDIT: Had chiamate vertice prima texcoord chiama

+0

Come non trattare correttamente i texcoords? fa esattamente quello che suggerisci ?? E le chiamate di TexCoord vengono _prima_ delle chiamate di vertice. – Bahbar

+0

Sta usando 150/8 invece di 8. Un buon punto sull'ordine di chiamata però - Non ho usato la modalità immediata da anni! – Pike65

+0

grazie Bahbar Mi ero appena reso conto di quale fosse il problema e stavo per postare la soluzione. Sì, questo era il problema! Grazie comunque – user461426

Problemi correlati