2012-02-10 19 views
3

私たちは、仮想3D地球上の地形の可視化ソフトウェアを開発する開発者のチームです。このプロジェクトは、主にタブレットや携帯電話などのアンドロイドを実行するモバイルデバイスを対象としています。私たちはいくつかのデバイスでこれをテストしましたが、携帯電話はアプリケーションをうまく実行しているように見えますが(いずれも問題は検出されませんでした)、スクリーンにテクスチャを描画するときにタブレットに問題があるようです。いくつかのアンドロイドデバイスでOpenglテクスチャがちらつく

単語を説明するのが少し難しいので、わかりやすくするために、問題を表示するビデオを添付してください。この例では、それぞれ異なるテクスチャを持つ200個のセクタに分割された球を示しています。

Texture problem video

あなたが見ることができるように、同時に同じ部門に2つの異なるテクスチャを描画しようとしているように、時にはそれが見えます。

我々は、これらのデバイスでこれをテストしている:(OK)

  • HTCの欲望(OK)
  • ヌーク電子ブックリーダー(OK)
  • サムスンギャラクシータブ10.1

    • サムスンギャラクシーS SLC(
    • ソニータブレットS(どちらも動作しません)
    • サムスンギャラクシータブ7.0(ok)

    これに関係する重要なコードを投稿しています。テクスチャを描画するために使用された最初のフラグメントシェーダ:

    varying mediump vec2 TextureCoordOut; 
    uniform sampler2D Sampler; 
    .... 
    gl_FragColor = texture2D (Sampler, TextureCoordOut); 
    

    次に、イム・コードは、いくつかの大きな機能に惜しまれているので、OpenGLで実行されているキーの指示を投稿:

    GLES20.glGenTextures(num, idTextures, 1); //declare 200 textures 
    ... 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, idTextures[texture]); //texture binding 
    ... 
    GLES20.glVertexAttribPointer(Attributes.Position, size, GLES20.GL_FLOAT, false, stride, fb); 
    ... 
    GLES20.glVertexAttribPointer(Attributes.TextureCoord, size, GLES20.GL_FLOAT, false, stride, fb); 
    ... 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, first, count); 
    

    イム詳細を提供できないのは残念ですが、デバッグの数週間後には、これを引き起こす可能性のあるものは何もありません。私たちは今、完全に失われているので、あなたはどんなリードを望んでいるのですか?前もって感謝します。

  • +0

    すべてのレンダリングサイクルの後に '' glFlush''または '' glFinish''を追加すると、レンダリングの状態がかなり変化しているように見えるようになります。 – harism

    +0

    提案してくれてありがとうが、残念ながらそれはうまくいきませんでした。 –

    答えて

    2

    困っていることが分かっていると思います。唯一のデバイスはTegra 2デバイスです。私は最近、Tegra 2デバイスで作業を開始し、特定の違いに気付きました。他のデバイスと比較して、Nvidiaは、ある種のものが他のGPUとは異なる動作をすることがある特定の種類の丸め誤差を導入したようです。極端な長さに移動し、複雑なシェーダで必要な方法で動作させるための回避策を使用する必要がありました。

    あなたのビデオで見ることができるものは、zバッファが十分な解像度を持たず、ある種のz戦闘を引き起こすようです。http://en.wikipedia.org/wiki/Z-fighting。非常に近い三角形を描画していて、zバッファ内でこのような動作を引き起こす可能性がある場合は、コード/記述から実際にはわからないため、わかりません。

    しかし、頂点(x、y、z)を幾分上下に拡大して、ちらつきがどうなるか見ることができます。もしそれが変わったら、それはおそらくそれと関係があります。そうでなければ、別の理由があるかもしれませんが、もう少しコードがうまくいくでしょう。

    球全体を塗りつぶすのではなく、問題が発生した場合は1つまたは2つの三角形だけを絞り込んで、それがまだ起こっているかどうかを調べることも、面白いでしょう。

    PS:長いビデオのほうがいいでしょう、短いクリップはvimeoを吸います。

    +0

    あなたの返事をありがとう、私はまだ何かを確認することはできませんでしたが、あなたが提供した情報のいくつかは有望に見えます!私はできるだけ早くあなたにいくつかのフィードバックをお送りします。また、悪いことに、より詳細なコードを投稿しようとしています(コードがかなり大きいという理由から)。 –

    +0

    私はいくつかのテストを行った。この場合、zバッファに問題はありません。我々は球の裏側を削除し、0から80までのセクターだけが表示されています。つまり、色付きのピクセルのほとんどには三角形しか投影されないため、zバッファーの戦いはありません。すべてのセクタは16×16の頂点(256の三角形)で構成され、それらの間に重なりはありません。 はい、Tegra2に関連する問題でなければなりませんが、それはまだわかりません。 –

    +0

    調査に値する可能性のあるもの:特定の三角形/四角形でのみちらつきが発生するのでしょうか、それともすべての場合に起こりますか?テクスチャを変更した場合(すべてのテクスチャを1つだけ使用する場合)は起こりますか? OpenGLをテスト目的で1.1に変更することはできますか?2.0にする必要はありますか?どのくらいのテクスチャメモリを使用していますか?あなたが実際にやっていることについて投稿していないことがたくさんあるので、私が言うことができるのは残念ながら純粋な推測です。私は本当にあなたがちょうど1つの三角形を表示し、何が起こるかを確認し、ゆっくりとその数を増加することをお勧めします – HardCoder

    関連する問題