10

少し前まで、テクセルの中心ではなくテクスチャ座標としてテクセルのエッジを使用していたため、テクスチャの表示に問題がありました。これを線形ブレンディングと組み合わせることで、テクスチャによって与えられる純粋な色ではなく、滑らかな色の結果が得られました。

ここで私に与えられたアドバイスのおかげで、テクセルの中心を座標として使用し始めたときに問題が解決したと思いましたが、それは1つのケースでしか機能せず、その1つのケースでのみ理由がわかりません.

改めて写真をいくつか紹介します。

これは、2 ピクセルの境界線で使用しているテクスチャ (32x32 ピクセル) です。

ここに画像の説明を入力

描画されているオブジェクト全体は 9 つのクワッドで構成されていますが、使用するテクスチャは 1 つだけです (私が示したもの)。それらの1つは私の問題の説明として役立ちます:

ここに画像の説明を入力

そのクワッドの色がテクスチャによって適切に設定されていないことがよくわかると思います。

ブレンディングの問題のように見えますが、テクスチャ座標を設定するために、次のようにテクセルの中心を使用しました。

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

明確にするために:

m_borderWidth= 2

maxTexCoordBorderX= maxTexCoordBorderY= 2/32 = 0.0625

texelCentersOffset= 1/64 = 0.015625

私が書いたもののどこが間違っているのか誰か教えてもらえますか?

EDIT1:

テクスチャの設定は次のとおりです。

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

GL_LINEAR から GL_NEAREST に変更すると、正常に動作するため、明らかにブレンディングに問題がありますが、なぜ間違っているのかまだわかりません。

EDIT2:

クワッドの高さをテクスチャの高さと同じかそれ以上に大きくすると、テクスチャ座標を変更せずに正しく機能します。

4

1 に答える 1

3

クワッドサイズをテクスチャのサイズよりも小さく設定すると、私には思えます。ミップマップを使用してテクスチャをサンプリングする必要があります。

ミップマップは、4 つのテクセル ブロックを平均化して作成されます。そのため、ミップマップをサンプリングすると、複数のテクセルから情報が取得されます。したがって、クワッドをテクスチャよりも小さくすることで、ミップマップをサンプリングする必要があり、テクスチャ ブリードが発生します。ミップマッピングをオフにすると、消えてなくなると思います。

于 2012-12-21T18:55:23.397 に答える