OpenGL ES iPhone-アンチエイリアス線の描画
-
06-07-2019 - |
質問
通常、次のようなものを使用します:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
glLineWidth(2.0f);
glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_LINE_STRIP, 0, num_points);
glDisableClientState(GL_VERTEX_ARRAY);
iPhoneシミュレーターでは見栄えが良いが、iPhoneではラインが非常に細くなり、アンチエイリアシングがない。
iPhoneでAAを取得する方法
解決
不透明度0の頂点を使用すると、アンチエイリアシングの効果を非常に安価に実現できます。 説明する画像の例を次に示します。
AAとの比較:
これに関する論文はこちらで読むことができます:
http://research.microsoft.com/en- us / um / people / hoppe / overdraw.pdf
この方法で何かをすることができます:
// Colors is a pointer to unsigned bytes (4 per color).
// Should alternate in opacity.
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
glEnableClientState(GL_COLOR_ARRAY);
// points is a pointer to floats (2 per vertex)
glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, points_count);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
他のヒント
iOSバージョン4.0 以降では簡単なソリューションが得られますが、わずか数行のコードを追加するだけでOpenGL ESシーン全体にアンチエイリアスを使用できるようになりました。 (そして、少なくともSGX GPUではパフォーマンスの低下はほとんどありません。)
コードについては、次のApple Dev-Forumスレッドをお読みください。 ブログには、サンプル写真もあります。
http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/ を出発点として、私はできましたこれらのようなアンチエイリアスされた行を取得するには:
これらは完璧ではなく、Core Graphicsで描いていたものほど良いものでもありませんが、かなり良いものです。私は実際に同じ線(頂点)を2回描画しています-1回は大きなテクスチャと色で、次に小さなテクスチャと半透明の白で。
線の重なりが密すぎてアルファが蓄積し始めると、アーチファクトが発生します。
この制限を回避する方法の1つは、行をテクスチャ付きの三角形のストリップにテッセレーションすることです(こちらをご覧ください) )。
問題は、iPhoneではOpenGlがメインフレームバッファーではなくフレームバッファーオブジェクトにレンダリングすることであり、FBOはマルチサンプリングをサポートしていないことを理解しています。
表示サイズの2倍で別のFBOにレンダリングし、テクスチャフィルタリングに依存して物事をスムーズにするなど、実行できるさまざまなトリックがあります。これは動作します。
私はこれを試したことを非常に具体的に覚えており、iPhoneでOpenGLを使用してこれを行う簡単な方法はありません。 CGPathsとCGContextRefを使用して描画できますが、それはかなり遅くなります。
これをレンダーメソッドとsetUpFrameバッファに追加します... アンチエイリアスされた外観になります。
/*added*/
//[_context presentRenderbuffer:GL_RENDERBUFFER];
//Bind both MSAA and View FrameBuffers.
glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, framebuffer );
// Call a resolve to combine both buffers
glResolveMultisampleFramebufferAPPLE();
// Present final image to screen
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
[_context presentRenderbuffer:GL_RENDERBUFFER];
/*added*/