通常、次のようなものを使用します。
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 Thread 。
http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/ を開始点として使用して、I次のようなアンチエイリアス化された行を取得できました。
彼らは完璧ではないし、私がCore Graphicsで描いていたほどナイスでもありませんが、かなり良いです。私は実際に同じ線(頂点)を2回描画しています。1回は大きなテクスチャと色で、次に小さなテクスチャと半透明の白です。
線の重なりが密すぎてアルファが蓄積し始めると、アーチファクトが発生します。
この制限を回避する方法の1つは、ラインをテクスチャ化された三角形のストリップにテッセレーションすることです( here を参照)。
問題は、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*/