エッジのスカイボックステクスチャアーティファクト


12

Macでのスカイボックステクスチャの描画に奇妙な問題があります。iPhoneでは、すべてがうまくいきます。私は、成功せずに近くと遠い飛行機の値を変更しようとしました。

これは6つのテクスチャのスカイボックスであり、テクスチャごとにこれを設定しました。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

何が問題なのでしょうか?

スクリーンショット:

スカイボックスの端が見える空の画像

編集:

私は背景色を赤に設定して、テクスチャを貫通しているかどうかを確認しようとしました

また、テクスチャの座標をこれに変更しようとしました:

float err_corr = 0.5 / TEXTURE_SIZE;

GLfloat vertices[24] = {    
        -1.0f - err_corr, -1.0f - err_corr,  1.0f + err_corr,
    1.0f + err_corr, -1.0f - err_corr,  1.0f + err_corr,
    -1.0f - err_corr,  1.0f + err_corr,  1.0f + err_corr,
    1.0f + err_corr,  1.0f + err_corr,  1.0f + err_corr,
    -1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
    1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
    -1.0f - err_corr,  1.0f + err_corr, -1.0f - err_corr,
    1.0f + err_corr,  1.0f + err_corr, -1.0f - err_corr,
    };

そして、ボックスは次の順序で描かれます。
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

解決:

解決策は、キューブマップ自体にGL_CLAMP_TO_EDGEを設定することです!

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

回答:


8

個々のテクスチャごとに GL_CLAMP_TO_EDGE 設定したことを確信していますか?これは個々のテクスチャ状態の一部であり、デフォルトでGL_REPEATに設定されているため、glBindTextureでバインドした後に実行する必要があります。オリジナルの投稿で、文字通りテクスチャごとに設定していると言っていますが、実際のコードはどのように見えるのでしょうか?

例えば:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.

これは次と同じではありません:

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

エラーが見つかりました!キューブマップのすべてのテクスチャではなく、キューブマップ自体にGL_CLAMP_TO_EDGEを設定する必要がありました!glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);およびglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
マーティンピルチ

1

テクスチャの左右から「0.5f / texture_width」、上下から「0.5f / texture_height」を挿入します。サンプリングアーティファクトが表示されます-テクスチャサンプラーは通常、テクセルの中心からサンプリングするため、左右、上下(0および1 uv)では、サンプラーが範囲外にあるときに取得するテクセルの50%を取得します。これは、テクスチャの反対側またはデフォルトのサンプリング色です。


それが彼がGL_CLAMP_TO_EDGEセットを持っている理由です。境界外のサンプルに最も近いテクスチャ内ピクセルの値を取得させるべきです。あなたが説明することは非常にうまくいくかもしれませんが、問題がそもそもそこにある理由を説明しません。
aaaaaaaaaaaa

変更せずに試してみました:/
マーティンピルチ

0

私の最善の推測は、MACとiPhoneの違いはMACのアンチエイリアシングによって引き起こされるということです。私の3Dプログラミングは少し錆びていますが、すべての正方形を同じメッシュまたはそのようなものの一部にする必要があると思います。

汚れたハックの解決策は、すべての正方形を少し大きくしすぎて、互いに重なり合ってクリップし、それに応じてUV座標を調整することです。


効果なしでアンチエイリアスを無効にしました(by glDisable(GL_POLYGON_SMOOTH);)。私はCOORDSフォームを三角形ストリップとしてスカイボックスを描画しています-1 1に
マーティンのおむつカバーを

1
それがいいと思います。少なくとも今のところは推測できませんが、その黒が背景のにじみであるのか、テクスチャエッジが黒で表示されているのかを調べることで、問題を絞り込むことができます。アーティファクトの背後に赤いポリゴンを配置すると、アーティファクトはその色になりますか?
aaaaaaaaaaaa

壁を拡張して、重複するようにします(eBusinessが書いたように)-0.0001で十分だと思います。UV座標を変更する必要はありません。
-zacharmarz

1/10000は確かに十分ではありません。問題の大きさは1/4から1/2ピクセルの範囲にあるようです。したがって、テクスチャサイズに応じて、これが機能する最小の大きさは約1/1000になります。UV座標を調整しないことは少し粗雑です。テクスチャの性質上、視覚的なジャンプは目立たないかもしれませんが、それでも間違っています。いずれにせよ、ハッキングに関するさらなるアドバイスは、以前のコメントで尋ねた質問への回答に依存すべきです。
aaaaaaaaaaaa

アーティファクトは、テクスチャから背景がにじむことではありません。背景色を変更せずに赤に設定しました。また、テクスチャ座標を拡張しようとしました
マーティンピルチ

0

これは、古いハードウェア(またはiphoneかもしれません)のキューブマップの通常の問題です。を確認してください

GL_ARB_seamless_cube_map

ハードウェアで利用可能な場合は拡張機能。もしそうなら。問題はそれを使用することで適切に解決されます。


問題はiPhoneではなくGeForce 9400Mにあります。この拡張機能は利用できません。
マーティンピルチ

これは、シームレスであるかどうかに関係なく、キューブマップによって引き起こされる問題ではありません。これはテクスチャラッピングの問題です。
タラ

0

6つのテクスチャは、具体的にはキューブマップとして設定されていますか、それともスカイボックスの各面は独自のテクスチャで個別にレンダリングされていますか?早く聞いた PCシステムでは、キューブマップの処理に関しては、キューブエッジの近くでサンプリングしたときに、ある面のテクスチャから次の面のテクスチャにかけてフィルタリングする必要がなかったため、フィルタリングがやや劣っていたました。私の知る限り、SGX(iphone GPU)はエッジを正しくフィルタリングするはずです。

あなたのサイドテクスチャの下部が、アーティファクトに似た青い色合いに見えることが私には起こりました。たとえば、ピクセルの一番下の行(または数行)をマゼンタの恐ろしい色合いにして、それがアーティファクトの色を変えるかどうか試してみてください。これにより、何が起こっているか、何が起こっていないかについて、より多くのアイデアが得られるかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.