OpenGL-キューブ上の白いエッジ


12

私が作っているMinecraftのようなゲームでは、キューブに白い縁ができます。

ここに画像の説明を入力してください

暗いテクスチャではより顕著になります。テクスチャは次のように設定されています: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

助けがありますか?


3
各キューブのレンダリング方法とキューブの配置方法に関するコードを示していただけますか?
joncodo

1
テクスチャのラッピングは何か違うことをしますか?バインドしているテクスチャはどのような外観/サイズですか?
チャックD

私は、これが小さなタイルを使用する大きなテクスチャアトラスでも行われているのを見たことを指摘したかっただけです。例として、1024 * 1024タイルセット/アトラスがあり、32 * 32のタイルを使用しているとします。上記のタイルにマッピングされる小数点が非常に小さい倍精度であるため、丸めエラーが発生します。これにより、精度がほぼ不可能になります。解決策?タイルアトラスを個々のタイルに分割します。これは、Minecraftが行うこと、または以前使用していたことです。大きなタイルセットが1つあり、実行時にそれを個々のテクスチャに切り刻みました。
クリシック

回答:


19

このタイプの問題には、どの問題であるかによって2つの原因が考えられます。両方をリストします:

1.テクスチャのタイルの端に沿って他の色が見えます。

これは、この場合の問題のように見えます。エッジピクセルはすべて、テクスチャにもっともらしい3色(白、黒、茶色)の1つであるためです。

単一のテクスチャ(テクスチャアトラス)で複数のタイルイメージを隣り合わせに使用している場合、これは避けられないことです。GPUが三角形のエッジに沿った補間とテクスチャに沿った補間を完全に一致させず、隣接するテクスチャのビットを少し取得するために発生します。

できることはたくさんあります。

  • テクスチャアトラスの代わりに配列テクスチャを使用します。配列テクスチャは、同じサイズの2D画像のスタックで構成されており、3番目の座標を指定して1つを選択します。これは、フィルタリング問題のないテクスチャアトラスの代替として正確に意図されています。ただし、配列テクスチャは新しい機能であり、使用しているOpenGLのバージョンでは使用できない場合があります。
  • 各テクスチャタイルに1ピクセルの境界線を生成し、隣接する通常のピクセルの色を複製します。(これは基本的にGLを再実装CLAMP[_TO_EDGE]していますが、テクスチャアトラスを意識した方法で、タイルのエッジのほとんどがテクスチャのエッジにないため、使用しても効果がありません。)これは私自身のエントリで使用するソリューションですジャンルでは、キューブ。より多くのテクスチャメモリを使用することを除いて、特に不利な点はありません。
  • テクスチャ座標を非常にわずかに挿入して、テクスチャタイルの端まで行かないようにします。これをやりすぎると、中央のピクセルと比較して、テクスチャのエッジが著しく薄くなります。
  • タイルタイプごとに1つのテクスチャを使用します。これにより、テクスチャの切り替えコストがかかります。

2.タイル間の隙間を通して見えています。

隙間から緑の地面が見えないため、これはこの場合の問題ではないと思いますが、完全性のためにそれを含めています。

これは、隣接するタイルのミーティングエッジの頂点にまったく同じ座標を提供していない場合に発生する可能性があります。これは通常、浮動小数点エラーが原因で発生します。たとえば、サイズ0.6のタイルを持っている場合とで、タイルの右端を計算するx=100(100*0.6) + 0.6、とのタイルの左エッジx=101とは(100*0.6)、あなたは正確に同じ答えを得ることはありません、その差は少し斑点として表示することができギャップ。

解決策は、算術の一貫性を確保することです。これを行ういくつかの方法は次のとおりです。

  • (間接的であっても)コンピューティングindex*size + sizeではなく、唯一のコンピューティングであることを確認してください(index+1)*size
  • 算術が正確であることを確認してください。これを行う最も簡単な方法は、タイルサイズを正確に1.0にすることです。これにより、32ビットの浮動小数点(とにかく最大で1600万ブロック)で計算を行っても、正確な整数演算が行われます。
  • 頂点座標の計算には実際の整数を使用します。これにより、さらに範囲が広がります。

私にはギャップのように見えます-小さくて鋭いビットを考慮すると、テクスチャのにじみはありません(かなり高解像度のテクスチャでない限り)。
マリオ

おかげで、テクスチャ座標を少しだけ埋めることで修正できるようです。
ルイスクルーズ

@Mario私はこれが最も近い倍率であると仮定します-タイルの内側の鋭い境界に注意してください。そのため、この観点では、無限の解像度のテクスチャです。
ケビンリード

テクスチャアレイを使用して、切り替えコストを回避することもできます。
ダニジャー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.