2012-12-18 10 views
8

Ich werde versuchen, mein Problem mit Bildern zu erklären. Das ist also ein Test Textur ich für meine OpenGL-Anwendung bin mit:Textur nicht richtig angezeigt - wahrscheinlich Koordinaten sind falsch OpenGL, C++

Wie Sie sehen können, gibt es einen 2-Pixel breiter Rahmen um das Bild mit verschiedenen Farben für mich in der Lage sein zu sehen, wenn die Koordinaten in meiner Anwendung richtig eingestellt sind.

Ich verwende ein 9-Zellen-Muster, also zeichne ich 9 Quads mit bestimmten Texturkoordinaten. Auf den ersten Blick alles funktioniert gut, aber es gibt ein kleines Problem mit der Anzeige einer Textur:

enter image description here

Im Bild I markiert, wo erste Quad ist, und wo ist die zweite. Wie Sie sehen können, wird der erste korrekt angezeigt, aber der zweite geht glatt von den Farben des ersten Quads zu seinem eigenen, aber er sollte mit reinem Grün und Rosa beginnen. Ich vermute also, dass es ein Problem mit Texturkoordinaten ist. Diese

ist, wie sie festgelegt sind:

// Bottom left quad [1st quad] 
glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(0.0f, 1.0);     
    glVertex2i(pos.x, pos.y + height); 

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

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

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

// Bottom middle quad [2nd quad] 
glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(maxTexCoordBorderX, 1.0);   
    glVertex2i(pos.x + m_borderWidth, pos.y + height); 

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

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

    // Bottom right 
    glTexCoord2f((GLfloat)1.0 - maxTexCoordBorderX, 1.0); 
    glVertex2i(pos.x + width - m_borderWidth, pos.y + height); 
glEnd(); 

Sie können sehen, dass ich maxTexCoordBorderX Variable bin mit der Rand und die Bildgröße auf Basis berechnet wird. Bildbreite ist 32 und Randbreite ist 2.

maxTexCoordBorderX = 2/32 = 0,0625

Könnte jemand bitte helfen Sie mit bei herauszufinden, wo das Problem ist?

Antwort

4

Am wahrscheinlichsten ist, dass Sie nicht auf den Texel-Zentren Proben nehmen. Wenn Sie beispielsweise eine Textur mit 32 x 32 Pixeln haben, sind die Texel-Zentren um 1/64 versetzt.

Hier ist ein grobes Diagramm einer 4x4 Textur. Die Quadrate sind die Texel (oder Pixel) des Bildes.

 
_________________1,1 
| | | | | 
| | | | | 
|___|___|___|___|_0.75 
| | | | | 
| | | | | 
|___|___|___|___|_0.5 
| | | | | 
| | | | | 
|___|___|___|___|_0.25 
| | | | | 
| X | | | | 
|___|___|___|___| 
0,0 | 0.5 | 1 
    0.25 0.75 

x = (0.125, 0.125) 

Wenn Sie auf eine der Linien probieren, werden Sie einen Wert genau zwischen zwei Texeln bekommen, die geben Ihnen einen Durchschnittswert (wenn Sie Textursampling-Set lineare Mischung haben). Wenn Sie den exakten Texelwert abtasten möchten, müssen Sie ein u, v in der Mitte des Texels angeben.

+0

Vielen Dank für die Antwort Jason, aber könnten Sie mir erklären, was Sie durch Abtasten auf den Texel-Zentren bedeuten haben? –

+0

Ich habe mit einem groben Diagramm aktualisiert. – JasonD

+0

Danke Jason, es hat mein Problem gelöst! –

-2

Sie verwenden int und float ...

Dies kann der Grund sein, auch die Art und Weise Sie das Bild auf OpenGL-Fenster zeigen können, können auch einige Farben Effekt.

+0

Sie meinen, dass Texturkoordinaten in Floats und Quadrate 'Scheitelpunkte' in Ints gesetzt sind? Ich denke nicht, dass es ein Problem sein sollte, da sie nichts miteinander zu tun haben ... –

+1

Ich denke, die GPU wird das Diff machen. Auch wenn Sie hier lesen: http://www.cs.sun.ac.za/~lvzijl/courses/rw778/grafika/OpenGLtuts/Big/graphicssnotes016.html sehen Sie (zum Beispiel: Spotlight-Effekte mit projektiven Texturen) viele Gründe, etwas falsch zu machen.Ein Beispiel finden Sie unter http://free-tutorials.org -> Tutorials -> Linux-Programmierung. Versuchen Sie GL_NEAREST (siehe http://duriansoftware.com/joe/An-intro-to-modern-OpenGL-Chapter-2.1:-Buffers-and-Textures.html) –

+0

zu sehen, wie ich es lösen: http://stackoverflow.com/questions/11361583/gl-texture-rectangle-arb/11363905#11363905 –