3

OpenGL ES2.0を使用してiOS4にアンチエイリアシングを実装する比較的簡単な方法はありますか?

真の3Dグラフィックスを取得するには、 OpenGLES2.0を優先してCoreAnimation放棄する必要がある状況がありました。

動作はしますが、 Core Animationを使用してレンダリングされた単純な3Dキューブは、ギザギザの線が多いOpenGLで生成されたものよりもはるかに鮮明であることに気付きました。

iOS 4.0がGL_TRIANGLE_STRIPのアンチエイリアシングをサポートしていることを読み、有望に見えるオンラインチュートリアル(リンクからのコードについては以下を参照)を見つけましたが、それを機能させることができませんでした。

私が最初に気付いたのは、 Open GLES1.0の残骸のように見えるすべてのOESサフィックスでした。

私が行ったことはすべてOpenGLES2.0用であるため、何が起こったかを確認するために、すべてのOESを削除してみました。エラーや警告なしでコンパイルおよびビルドされましたが、グラフィックがレンダリングされなくなりました。

OESサフィックスを保持すると、次のタイプのエラーと警告がいくつか表示されます。

Error - Use of undeclared identifier ''
Warning - Implicit declaration of function '' is invalid in C99

ES1ヘッダーファイルをインクルードすると、クリーンなビルドが得られましたが、それでも何もレンダリングされませんでした。とにかくこの機能を実装するためにES1.0ヘッダーファイルをインクルードする必要はないようです。

だから私の質問は、これをどのように機能させるのか、そしてそれは実際に私の問題に対処するのでしょうか?

私がリンクしたオンラインチュートリアルのアプローチは正しい考えを持っていて、実装を台無しにしただけですか、それともより良い方法がありますか?

ガイダンスや詳細をいただければ幸いです。


上記のリンクからのコード:

GLint backingWidth, backingHeight;

//Buffer definitions for the view.
GLuint viewRenderbuffer, viewFramebuffer;

//Buffer definitions for the MSAA
GLuint msaaFramebuffer, msaaRenderBuffer, msaaDepthBuffer;



//Create our viewFrame and render Buffers.
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);

//Bind the buffers.
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);



//Generate our MSAA Frame and Render buffers
glGenFramebuffersOES(1, &msaaFramebuffer);
glGenRenderbuffersOES(1, &msaaRenderBuffer);

//Bind our MSAA buffers
glBindFramebufferOES(GL_FRAMEBUFFER_OES, msaaFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaRenderBuffer);

// Generate the msaaDepthBuffer.
// 4 will be the number of pixels that the MSAA buffer will use in order to make one pixel on the render buffer.
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_RGB5_A1_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, msaaRenderBuffer);
glGenRenderbuffersOES(1, &msaaDepthBuffer);

//Bind the msaa depth buffer.
glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaDepthBuffer);
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_DEPTH_COMPONENT16_OES, backingWidth , backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, msaaDepthBuffer);



- (void) draw
{
    [EAGLContext setCurrentContext:context];
    //
    // Do your drawing here
    //
    // Apple (and the khronos group) encourages you to discard depth
    // render buffer contents whenever is possible
    GLenum attachments[] = {GL_DEPTH_ATTACHMENT_OES};
    glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 1, attachments);

    //Bind both MSAA and View FrameBuffers.
    glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer);
    glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, viewFramebuffer);

    // Call a resolve to combine both buffers
    glResolveMultisampleFramebufferAPPLE();

    // Present final image to screen
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
4

1 に答える 1

4

このhttps://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW12は、おそらくその最新バージョンです。チュートリアルで説明していました。4つのピクセルを描画し、それを画面上で1つにサンプリングするマルチサンプリングは、推奨される手法です。

于 2012-09-14T17:15:33.273 に答える