2012-12-18 6 views
9

Non molto tempo fa ho avuto un problema con la visualizzazione di una texture poiché utilizzavo bordi di texel come coordinate di trama invece di centri di texel. Questo, in combinazione con la miscelazione lineare ha dato un risultato uniforme di colori invece di colori puri dato da una trama.Campionamento sui centri di texel non dà risultati corretti, OpenGL, C++

Grazie ai consigli forniti qui, ho pensato che il mio problema fosse risolto mentre ho iniziato ad usare i centri di texels come coordinate, ma ha funzionato solo in un caso e non ho idea del perché solo in quel caso.

Ancora una volta mostrerò alcune immagini.

Si tratta di una texture che sto utilizzando (32x32 pixel) con bordo di 2 pixel:

enter image description here

Tutto il mio oggetto che è in fase di elaborazione si compone di 9 quad, ma usano solo una trama (quello che ho mostrato). Uno di loro servirà come spiegazione al mio problema:

enter image description here

Penso che sia ben visibile che i colori di quel quad non sono impostati correttamente in base alla consistenza.

Sembra un problema con la miscelazione, ma per l'impostazione coordinate texture ho usato centri di texel, in questo modo:

glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(0.0 + texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x, pos.y + height - m_borderWidth); 

    // Top left 
    glTexCoord2f(0.0 + texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x, pos.y + m_borderWidth); 

    // Top right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth); 

    // Bottom right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth); 
glEnd(); 

Per chiarimenti:

m_borderWidth = 2

maxTexCoordBorderX = maxTexCoordBorderY = 2/32 = 0,0625

texelCentersOffset = 1/64 = 0,015625

Qualcuno potrebbe dirmi cosa c'è che non va in quello che ho scritto?

Edit1:

Qui ci sono le impostazioni per la mia texture:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
       GL_LINEAR_MIPMAP_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
        GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
        GL_REPEAT); 
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, m_width, m_height, 
        GL_RGBA, GL_UNSIGNED_BYTE, pixmap); 

Quando cambio da GL_LINEAR a GL_NEAREST, funziona correttamente quindi è ovviamente un problema con la fusione, ma ancora non riesco a capire perché è sbagliato

EDIT2:

Quando ho aumento di altezza del quad per essere uguale o maggiore di altezza della texture, funziona correttamente senza modificare le coordinate della texture.

+0

Dove impostate le vostre matrici di proiezione e modelview? Qual è il valore di 'pos'? – genpfault

+0

@genpfault pos.x e pos.y sono 0, quindi possono essere omessi. Le matrici sono impostate all'inizio come segue: glViewport (0, 0, larghezza, altezza); // Reimposta Current Viewport glMatrixMode (GL_PROJECTION); // Seleziona The Projection Matrix glLoadIdentity(); \t \t \t \t \t \t \t \t \t // Reset The Matrix proiezione \t glOrtho (0,0, larghezza, altezza, 0.0, 0.0, 1.0); glMatrixMode (GL_MODELVIEW); \t \t \t \t \t \t // Selezionare The Modelview Matrix glLoadIdentity(); \t \t \t \t \t \t \t \t \t // Reset The Matrix Modelview –

+0

Non si dovrebbe cercare di assegnare centri Texel a vertici. Quello che vuoi veramente è che i texel siano centrati sui frammenti risultanti * dopo * la rasterizzazione. Ho scritto una bella risposta (qui con le immagini da spiegare), forse leggere questo ti aiuterà a capire: http://stackoverflow.com/a/11458037/1236185 – Tim

risposta

1

Mi sembra, che quando si imposta la dimensione quad meno della dimensione della trama. Deve campionare la texture usando una mipmap.

I mipmap vengono realizzati calcolando la media di 4 blocchi di texel. Quindi, quando assaggi la mipmap ottieni informazioni da più di un texel. Quindi, facendo in modo che il tuo quad sia più piccolo della texture, deve campionare una mipmap e stai ricevendo il bleed della trama. Spegni la procedura di mipmapping e la mia ipotesi è che andrà via.

+0

Siamo spiacenti per una risposta in ritardo, ma sì, è stato un problema. Grazie, Tocs! –

Problemi correlati