web-dev-qa-db-ja.com

OpenGL ES iPhone-アンチエイリアスラインの描画

通常、次のようなものを使用します。

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を取得しますか?

37
quano

不透明度0の頂点を使用すると、アンチエイリアシングの効果を非常に安価に実現できます。説明する画像の例を次に示します。

alt text

AAとの比較:

alt text

これに関する論文をここで読むことができます:

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);
59
quano

iOSバージョン4.0以降では、簡単な解決策がありますが、わずか数行のコードを追加するだけでOpenGL ESシーン全体にアンチエイリアスを使用できるようになりました。 (少なくともSGX GPUでのパフォーマンスの低下はほとんどありません)。

コードについては、次のApple Dev-Forum Thread

25
Bersaelor

http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/ を開始点として使用して、I次のようなアンチエイリアス化された行を取得できました。 alt text

彼らは完璧ではないし、私がCore Graphicsで描いていたほどナイスでもありませんが、かなり良いです。私は実際に同じ線(頂点)を2回描画しています。1回は大きなテクスチャと色で、次に小さなテクスチャと半透明の白です。

線の重なりが密すぎてアルファが蓄積し始めると、アーチファクトが発生します。

6
westsider

この制限を回避する方法の1つは、ラインをテクスチャ化された三角形のストリップにテッセレーションすることです( here を参照)。

4
prideout

問題は、iPhoneではOpenGlがメインフレームバッファーではなくフレームバッファーオブジェクトにレンダリングすることであり、FBOはマルチサンプリングをサポートしていないことを理解しています。

表示サイズの2倍で別のFBOにレンダリングし、テクスチャフィルタリングに依存して物事をスムーズにするなど、実行できるさまざまなトリックがあります。

3
Paul

私はこれを試したことを非常に具体的に覚えており、iPhoneでOpenGLを使用してこれを行う簡単な方法はありません。 CGPathsとCGContextRefを使用して描画できますが、それは大幅に遅くなります。

2
Ed Marty

これをレンダーメソッドと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*/
0
Abhishek Bedi