3

私はAndroid用のアプリに取り組んでおり、ユーザーは画面をタップして色を描くことができます。私はすべての描画コードをOpenGLでうまく機能させています(Android 4.0.4、Galaxy Nexusでテストしていますが、これを可能な限り下位互換性を持たせようとしています。私のSDKはAPI 14を対象としていますが、minSDKは8です。 )。

私が遭遇した問題はアンチエイリアスです。すべてのポリゴンとラインをアンチエイリアス処理したいのですが、ギザギザになっています。Galaxy Nexusがアンチエイリアスをサポートしていることは確かです(他のアプリでも見たことがあります)ので、何か間違ったことをしていると確信しています。

私は1時間以上Googleを上下し、いくつかのStackOverflow Q / Aを行ってきましたが、いくつかの答えが見つかりました。

gl.glEnable(GL10.GL_BLEND);
gl.glEnable(GL10.GL_ALPHA_BITS);
gl.glEnable(GL10.GL_MULTISAMPLE);
gl.glEnable(GL10.GL_SMOOTH);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_NICEST);

これらの行の一部またはすべてをさまざまな順序で追加しましたが、効果はありません。(これらはonSurfaceCreatedに追加されました。)

gl.glEnable(GL10.GL_DITHER);

これは少し役に立ったと思います...しかし、それは私の心が私にトリックをすることかもしれません。ただし、使用してもギザギザの線が残っています。(onSurfaceCreatedにも追加されています。)

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

これが最も一般的な答えのようです。しかし、これを行うと、すべてが見えなくなります。つまり、黒の背景から始めると、常にすべてが黒になります。(LogCatのメモリフラッシュメッセージが原因でまだ描画されていることはわかっています。)また、上記の他のすべての方法と組み合わせてこれを試しました。(これはonSurfaceCreatedにも追加されました。)

要約すると、Android 4以降でOpenGLを使用していますが、マルチサンプリングメソッドが機能していないようです。ほとんどの場合効果はありませんが、glBlendFuncを使用するとレンダリングが完全に中断するようです。

だから、私はかなり困惑しています。私はどんな提案にもオープンです...彼らは確かに私のコンピュータを防御する以上の助けになるでしょう!

これを読むのに十分な患者の皆さんに事前に感謝します。

4

2 に答える 2

1

EGLコンテキストでマルチサンプリングを要求していない場合は、GL関数だけでマルチサンプリングをオンにすることはできません。その方法については、こちらをご覧ください。

于 2012-06-06T07:02:10.350 に答える
1


c ++ srryでプログラミングできない場合は 、c ++(android ndk)でマルチサンプリングesayを有効にできます。

  1. android-ndkをインストールします(私のandroid ndkバージョンはr8bです)
  2. 開ける android-ndk-r8b/samples/android-native-egl-example/jni/renderer.cpp
  3. 追加をインクルードEGL/egl.h GLES/gl.h GLES2/gl2.h GLES2/gl2ext.hファイルに変更
  4. ブール値Renderer::initialize() function :

変化する

   const EGLint attribs to {
                EGL_RED_SIZE, 5,  
                EGL_GREEN_SIZE, 6,  
                EGL_BLUE_SIZE, 5,  
                EGL_DEPTH_SIZE, 16,  
                // Requires that setEGLContextClientVersion(2) is called on the view.
                EGL_RENDERABLE_TYPE, 4 /* EGL_OPENGL_ES2_BIT */,
                EGL_SAMPLE_BUFFERS, 1 /* true */,
                EGL_SAMPLES, 2,
                EGL_NONE  };

EGL_SAMPLESこの引数はサンプル数を変更することが重要です

于 2014-02-17T12:29:51.060 に答える