40

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

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を取得するにはどうすればよいですか?

4

7 に答える 7

61

不透明度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);
于 2009-12-31T03:01:04.480 に答える
26

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

コードについては、次の Apple Dev-Forum Threadをお読みください。私のブログには、私がどのように見えるかのサンプル写真もあります。

于 2010-09-27T16:58:32.817 に答える
6

http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/を開始点として使用して、アンチエイリアスを取得することができましたこのような行: 代替テキスト

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

線がきつく重なりすぎてアルファが蓄積し始めると、アーティファクトが発生します。

于 2010-09-26T15:34:28.767 に答える
4

この制限を回避する方法の 1 つは、線をテクスチャ付きの三角形ストリップにテッセレーションすることです (ここで見られるように)。

于 2009-11-28T20:33:03.307 に答える
3

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

表示サイズの 2 倍で別の FBO にレンダリングし、テクスチャ フィルタリングを使用して滑らかにするなど、さまざまなトリックを実行できます。

于 2009-11-28T20:10:01.557 に答える
2

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

于 2009-11-28T19:52:07.070 に答える
0

これをrenderメソッドと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*/
于 2011-08-24T05:32:25.670 に答える