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:
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:
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.
Dove impostate le vostre matrici di proiezione e modelview? Qual è il valore di 'pos'? – genpfault
@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 –
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