2011-02-08 5 views
4

は、私は次のコードを持っている:Android OpenGL ESでギザギザのエッジを取り除くには?

public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glClearDepthf(1.0f); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL10.GL_LEQUAL); 
    //gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
    gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST); 
} 

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 

をしかし、まだエッジはAndroidのエミュレータでひどくギザギザしています。解決策は何ですか?

答えて

4

マルチサンプリング(アンチエイリアス処理)を使用することをお勧めします。エミュレータを使用しているので、これはオプションではありません。 (OpenGL ES 2.0ではMultispaplingがサポートされていますが、エミュレータは2.0をサポートしていません) OpenGL仕様によれば、デバイスは設定したglHintを無視することができます。 GL_DITHERは、16ビットの色深度から24ビットの色深度を「偽造」する方法です。基本的には、エッジとは関係ありません。

また、アンチエイリアスを「偽」する古い方法があります。私はこれまで使用していなかったものと同じですので、どのように説明できますか?ウェブでヒントを見つけることができます。 OpenGL docs

ブレンド関数(GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA)から

はまた、任意の順序でアンチエイリアス点や線を描画するのに有用です。

ポリゴンのアンチエイリアシングは、ポリゴンを最も近いものから最も遠いものにソートしたブレンド機能(GL_SRC_ALPHA_SATURATE、GL_ONE)を使用して最適化されます。

+0

レコードの場合、誰かがこの問題を抱えている場合に備えて、AVDはOpenGL ES 2をサポートするようになりました。0ホップストGPUデプロイメント(オプション、チェックボックスに注意)。 –

+0

FYI、thakisの回答のようにシェーダを書く必要のないマルチサンプリングを可能にするアプローチは、svdreeの答えhttp://stackoverflow.com/a/7388176/199364にあります。私のコメントには、彼のアプローチを使用するように見えます。 – ToolmakerSteve

1

"ヒント"を使用してポリゴンスムージングを有効にしています。ヒントは、ポリゴンのエッジを滑らかにしたいという実装のヒントです。実装が望むなら、実装はそれを無視することが自由です。

これはまさにそれがやっていることです。

さらに、アンドロイドデバイスのアンチエイリアス機能を有効にすることができないため、アンドロイドデバイスのアンチエイリアスをオンにすることはできません。これはハンドセットによって異なる場合がありますが、やはりヒントを設定しています。

+0

[OK]をので、ギザギザにかなりAPIを経由してヒントを与えるよりも代替ソリューションがあります:私は何を探していることは、次のコード行であると思いますか?エミュレータがアンチエイリアシングをサポートしているかどうかはわかりません。経験豊富なAndroidデベロッパーがこれを確認できますか?私はAPIレベル8ビルドターゲット2.2を使用しています。 – ace

+1

@Alan:アンチエイリアスを得るために、倍幅の(または背の高い、または両方の)バッファにレンダリングしてから、バックグラウンドにレンダリングしてアンチエイリアスをフェイズすることはできますが、回す方法はわかりませんAndroidでのアンチエイリアス... – Goz

+0

私はOpenGlの他の問題に取り組んでいます。ここで説明した提案をテストしたら、私は書き戻します。 – ace

0
  1. デバイスで試してください。私は視覚/グラフィック関連の問題のエミュレータを信頼していません。
  2. gl.glEnable(GL10.GL_DITHER);を試してください。これがデフォルトでオンになっているかどうかはわかりません。また、これにより描画が遅くなります。
+1

-1。ディザリングはギザギザのエッジとは関係ありませんが、フレームバッファ(ピクセルあたり16ビットなど)に低いビット深度が使用されている場合にバンディングが減少します。 –

1

私はちょうどあなたと同じ問題を経験しました。

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
+0

いいえ、内部のピクセルのテクスチャリングと関係がありますテクスチャの色がスムーズにブレンドされるようにします。問題はEDGESについてです。例えば、3Dモデルのシルエットに沿って。または、より明るく、より暗い背景に対して、三角形ファンの最終エッジ。 – ToolmakerSteve

関連する問題