8

私の問題を画像で説明しようとします。これは、OpenGL アプリケーションに使用しているテスト テクスチャです。

ご覧のとおり、アプリケーションで座標が適切に設定されているかどうかを確認できるように、画像の周りにさまざまな色の 2 ピクセル幅の境界線があります。

私は 9 セル パターンを使用しているので、特定のテクスチャ座標で 9 つのクワッドを描画しています。一見するとすべて問題なく動作しますが、テクスチャの表示に小さな問題があります。

ここに画像の説明を入力

写真では、最初のクワッドと 2 番目のクワッドをマークしました。ご覧のとおり、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

2 に答える 2

4

最も可能性の高い原因は、テクセルセンターでサンプリングしていないことです。たとえば、32x32ピクセルのテクスチャがある場合、テクセルの中心は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つでサンプリングすると、2つのテクセルの間の値が正確に得られます。これにより、(テクスチャサンプリングが線形ブレンドに設定されている場合)平均値が得られます。正確なテセル値をサンプリングする場合は、テセルの中央にau、vを指定する必要があります。

于 2012-12-18T09:00:12.697 に答える
4

フェンスポストの問題に遭遇しました。ここであなたの問題の解決策に答えました

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

于 2012-12-18T09:32:05.377 に答える