2012-12-18 9 views
8

画像で私の問題を説明しようとします。だから、これは私が私のOpenGLアプリケーションのために使用していた試験食感です:テクスチャが正しく表示されない - おそらく座標が間違っているOpenGL、C++

あなたが見ることができるように私が見ることができるようにするために、異なる色と画像の周囲2ピクセル幅の境界線があります私のアプリケーションで座標が正しく設定されていれば

私は9セルのパターンを使用しているので、特定のテクスチャ座標を持つ9つの四角形を描画しています。一見、すべてでは正常に動作しますが、小さな問題は、テクスチャを表示してあります:最初のクワッドである私はマークされた画像で

enter image description here

を、どこ秒1です。あなたが見ることができるように、最初のものは正しく表示されますが、2番目のものは最初のクワッドの色からそれ自身のものにスムーズに移行しますが、純粋な緑とピンクから始める必要があります。だから私はテクスチャ座標の問題だと思っています。

これは、彼らが設定されている方法です。

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

あなたは、私が国境や画像サイズに基づいて計算されmaxTexCoordBorderX変数を使用していることがわかります。画像の幅は32で、境界線の幅は、問題がどこにあるか見つけるとで2

maxTexCoordBorderX = 2/32 = 0.0625

誰が助けてもらえますか?

答えて

4

おそらく原因は、テクセルセンターでサンプリングしていないことです。たとえば、32×32ピクセルのテクスチャを持つ場合、テクセルセンターは1/64でオフセットされます。

ここには4x4テクスチャの概略図があります。四角形はイメージのテクセル(またはピクセル)です。

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

x = (0.125, 0.125) 

あなたがラインの1にサンプリングした場合、あなたは(あなたがリニアブレンドに設定テクスチャサンプリングを持っている場合)あなたの平均値を与えるであろう、ちょうど二つのテクセルの間の値を取得します。正確なテクセル値をサンプリングする場合は、テクセルの中央にu、vを指定する必要があります。

+0

が答えジェイソンいただきありがとうございますここにあなたの非常に問題に解決策に答えが、あなたは私を説明できますか? –

+0

私は概略図で更新しました。 – JasonD

+0

ありがとう、ジェイソン、それは私の問題を解決! –

-2

あなたがintとfloatを使用して...

これが理由、あなたはまた、いくつかの色に影響を与えることができますOpenGLのウィンドウに画像を表示することができ、また方法することができます。

+0

テクスチャ座標は、浮動小数点数や四角形の頂点位置にint型で設定されていますか?私は彼らがお互いに何もしていないので、それが問題でなければならないとは思わない... –

+1

私はGPUがdiffを作ると思う。また、ここで読んだ場合:http://www.cs.sun.ac.za/~lvzijl/courses/rw778/grafika/OpenGLtuts/Big/graphicsnotes016.html(例えば:投影テクスチャを使用したスポットライトエフェクト)多数間違ったことをする理由。http://free-tutorials.org - >チュートリアル - > linuxプログラミングの例を見てください。 GL_NEARESTを使用してみてください(http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-2.1:Buffers-and-Textures.htmlを参照してください) –

+0

私がそれを解決する方法を見てください:http:///stackoverflow.com/questions/11361583/gl-texture-rectangle-arb/11363905#11363905 –

4

あなたはフェンスポストの問題に遭遇しました。あなたはテクセルの中心にサンプリングすることによって何を意味した私は

https://stackoverflow.com/a/5879551/524368

+0

答えをdatenwolfありがとう、それは参考にされました! –

関連する問題