2017-04-01 15 views
-1

テクスチャをタイルするフラグメントシェーダを作成しました(実際はテクスチャ配列です)。しかし、私はそれぞれのタイルの周りに非常に醜い1ピクセルの境界線を取得します。私はこれが機能の不連続によって引き起こされ、ミップマップ中に変なものが発生することがあることを知っていますが、ミップマップは無効になっています(アンチエイリアスを使用していますが)。ここに私のコードは次のとおりです。ミップマッピングが無効のときにタイル境界線を取り除く方法

vec2 tiledCoords = fract(pass_textureCoords * 256.0)/4.0; // pass_textureCoords are the texture coordinates 

out_Color = texture(testArray, vec3(tiledCoords.x, tiledCoords.y, 0)); // testArray is the sampler2DArray 

私は丸め誤差の許容のビットを与える必要があるだろうと思ったが、私はそれをどこに置くかを見つけ出すように見えることはできません。 どうやってこれらの醜い罫線を取り除くことができますか?ありがとうございます!ここで

はスクリーンショットです: Ugly lines

+0

テクスチャパラメータはどのように設定されていますか?ラップモードとフィルターについて。 – pleluron

+0

@pleluronラップモードまたはフィルタはありません。私はテクスチャを 'glTexSubImage3D'(その配列から)を使って定期的にロードし、レンダリングの前に単にテクスチャをバインドしました。 –

+0

また 'GL_CLAMP_TO_EDGE'を使用していますか?そうでない場合(あなたのコメントが示唆するように)テクスチャ座標「0.0」と「1.0」はテクスチャの外にあり、あなたは黒い境界に当たっています。テクスチャを1つシフトする必要があります。テクスチャが '256x256'の場合、座標は '<0.0 , 1.0>'の代わりに' <1/256,255/256>の間隔で指定する必要があります。 – Spektre

答えて

2

私はあなたのコードでの計算でやろうとしているかを正確にはわかりません。最初の行は、結果に全く貢献していないようです(2行目で上書きされます)。フィルタモードまたはラップモードを設定していないため、リニアフィルタリングとリピートモードのデフォルト設定が有効になります。

[0、0.25]の範囲でtiledCoordsを使用しているようですが、0.25から0までラップしようとしています。0.25の自動ラップモードがないので、この場合は線形フィルタリングは自動的に機能しません→0遷移。黒い線は、[0,1 /(2 * num_pixels)]の範囲の線形補間の原因です。なぜなら、この領域は0番目のテクセルと "-1番目"のテクセルの間を直線的に補間するからです(ラップモードのため、テクスチャ)。 [0.25 - 1 /(2 * num_pixels)、0.25]の範囲で同じことが起こります。ここでは、テクスチャ座標0.25の右にあるピクセルをその右のテクセルで補間します。

シナリオにハードウェア線形補間を適用する方法はありません。最近接サンプリングを使用するか、線形補間を手動で計算できます。

関連する問題