2012-04-27 7 views
2

私は、頂点の同じセットを持ち、お互い隣になるように翻訳された2つのオブジェクトの間に、時折1つのピクセルホールがあるという問題に遭遇しました。私は単純な四角い線でこれを再現することができました。翻訳された四角間のOpenGL Pixel Gap

四角形は1単位で1単位、0,0 centerです。私は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(); 

画像は、このような場合を示しています。私は問題のピクセルの周りのスクリーンショットに赤い円を追加しました。私がこれまでにそうすること、これが事実である理由は分からない、と最終的に「世界」は、単純な正方形のため平方翻訳を排除する座標の指定が可能である(と問題を解決)しながら、

Image

最初に問題に気づいた複雑なジオメトリは実際には実用的ではありません。

答えて

3

私は効果がどのように呼ばれているのかわかりませんが、どのように起こるのか分かります。

2つのポリゴンがエッジを「共有」しているにもかかわらず、そのエッジの端点が異なる値から計算されている場合は、結果として変換された頂点座標に必ずerrorがあります。頂点の座標にわずかな誤差があると、それを使用するエッジを構成するポイントが変わります。そのため、例のように、(1)重複するピクセル(通常大きな問題ではありません)と(2)ピクセルがありません。

通常、一般的な頂点の重複を最小限に抑えるために努力していますが、一般的に問題はハードになる可能性があります。

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

可能な解決策の1つは、影響を受けたオブジェクトにスケール変換を非常に小さな倍率で適用することです。 1.00001。これにより、オブジェクトが少しずつ重なるようになり、無視されたピクセルはすべて削除されます。あなたのマイレージは異なる場合があります。

+0

と思われます。ユーザーがブロックを置いて建物を作り上げることを可能にする他のゲームがどうやって周りを回ったのか知っていますか?彼らは実際に新しいメッシュを計算しましたが、既存のものを変換するのではなく、小さなサブピクセルのオーバーラップを作成するだけでしたか?私は翻訳をやっていることを発見しました(そしてまた90度の回転も)自分自身も問題を解決しています(エラーははるかに複雑なカメラ変換との組み合わせから来ていると思います)。 –

関連する問題