3

同じ頂点セットを持つが、互いに隣り合うように変換された 2 つのオブジェクト間の結合に沿って 1 つのピクセル ホールが時折あるという問題に遭遇しました。シンプルな正方形のラインでこれを再現することができました。

正方形は、中心が 0,0 の 1 単位 x 1 単位です。glTranslatef を使用して各正方形を所定の位置に移動し、これらの正方形を一列に配置しました (この場合、提供する値は常に整数です)。カメラが特定の位置にある場合、OpenGL はこれらの四角形の間に 1 ピクセルのギャップを残し、そこから背後にあるもの (たとえば、バック バッファをクリアした色) を確認できることがわかりました。角が 0,0 になるように正方形の頂点を変更しても、問題は解決しませんでした。

コード例:

glPushMatrix();
glTranslatef(0, 0, 0);
drawSquare();
glPopMatrix();

glPushMatrix();
glTranslatef(0, 0, 1);
drawSquare();
glPopMatrix();

glPushMatrix();
glTranslatef(0, 0, 2);
drawSquare();
glPopMatrix();

画像はそのような場合を示しています。問題のピクセルの周りのスクリーン ショットに赤い円を追加しました。

画像

これが事実である理由はわかりません。最終的な「世界」座標を指定して、単純な正方形の正方形ごとの変換を排除することは可能ですが(そして問題を解決します)、最初に問題に気付いたはるかに複雑なジオメトリでそうしますは実際には実用的ではありません。

4

1 に答える 1

3

その効果が何と呼ばれているかはわかりませんが、それがどのように起こるかは知っています。

2 つのポリゴンが 1 つのエッジを「共有」しているが、そのエッジの端点が異なる値から計算されている場合、変換された頂点座標には常に何らかのエラーが発生します。頂点座標のわずかなエラーは、それを使用するエッジを構成するポイントを変更するため、例に示すように、(1) オーバーラップ ピクセル (通常はそれほど大きな問題ではない) と (2) 欠落ピクセルが得られます。

通常、共通の頂点の重複を最小限に抑えるためにある程度の努力をすることができますが、一般的に、問題は困難になる可能性があります。

たとえば、Minecraft にも同じ問題があります。

考えられる簡単な解決策の 1 つは、影響を受けるオブジェクトに非常に小さな倍率 (1.00001 など) でスケール変換を適用することです。これにより、オブジェクトがわずかに重なり合い、無視されたピクセルが削除されます。あなたのマイレージは異なる場合があります。

于 2012-04-27T03:37:16.447 に答える