1

私はAndroidNDKとOpenGLから始めています。ここで何か(おそらくいくつか)間違ったことをしていることはわかっています。テストすると黒い画面が表示され続けるので、レンダリングが画面に送信されていないことがわかります。

Javaには、これら2つのネイティブメソッドを呼び出すGLSurfaceView.Rendererがあります。それらは正しく呼び出されていますが、デバイス画面に描画されていません。

誰かがこれで私を正しい方向に向けることができますか?

ネイティブメソッドの実装は次のとおりです。

int init()
{
    sendMessage("init()");

    glGenFramebuffersOES(1, &framebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

    glGenRenderbuffersOES(1, &colorRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, 854, 480);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

    GLuint depthRenderbuffer;
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, 854, 480);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

    GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
    if(status != GL_FRAMEBUFFER_COMPLETE_OES)
        sendMessage("Failed to make complete framebuffer object");

    return 0;
}

void draw()
{
    sendMessage("draw()");

    GLfloat vertices[] = {1,0,0, 0,1,0, -1,0,0};
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
}

ログ出力は次のとおりです。

init()draw()draw()draw()など。

4

3 に答える 3

4

これが本当の解決策だとは思いません。

ここでも同じ問題が発生しています。ネイティブコード内でフレームバッファオブジェクトを使用し、

framebuffer = (GLuint) 0;

常に存在し、0に予約されているデフォルトのフレームバッファのみを使用しています。技術的には、フレームバッファに関連するすべてのコードを消去できます。フレームバッファ0は常に生成され、defautによってバインドされるため、アプリは正常に動作するはずです。 。

ただし、必要に応じて、バインディング関数(glBindFramebuffer)を使用して、複数のフレームバッファーを生成し、それらを入れ替えることができるはずです。しかし、それは私の側ではうまくいかないようで、私はまだ本当の解決策を見つけていません。androidの部分に関するドキュメントはあまりなく、fboがネイティブコードで本当にサポートされているかどうか疑問に思い始めています。ただし、Javaコード内では正しく機能しますが、成功してテストしました。

おー !そして、私はあなたのバッファの寸法が2の累乗ではないことに気づきました...これは通常、Openglの構造のようなすべてのテクスチャ/バッファに当てはまるはずです。


アップデート :

これで、Android(2.2以下)およびndk(バージョンr5b以下)でFBOを使用できないと確信しています。新しい3.1リリースを使用する場合は、まったく異なるゲームです。ネイティブコードを使用してすべてのアプリをコーディングできます(jniラッパーは不要です)が、まだテストしていません。

一方、私はステンシルバッファとテクスチャを完璧に機能させることができました!したがって、回避策は、レンダリングロジックにそれらを使用し、FBOオフスクリーンレンダリングを忘れることです。

于 2011-05-12T20:53:35.400 に答える
1

かなりいじくり回した後、私はついに問題を見つけました。

JavaでGLSurfaceView.Rendererからコードを呼び出していたため、フレームバッファーは既に存在していたため、次のように呼び出します。

glGenFramebuffersOES(1, &framebuffer);

ターゲットディスプレイに接続されていない新しいバッファを意図せずに割り当てていました。この行を削除して、次のように置き換えます。

framebuffer = (GLuint) 0;

これで、正しいバッファにレンダリングされ、画面に正しく表示されます。このスニペットでは実際にはバッファを使用していませんが、バッファを変更すると、適切な表示が台無しになることに注意してください。

于 2011-01-21T03:13:05.647 に答える
0

iOSからAndroidNDKに移行するときにも同様の問題が発生しました。これも、私の完全な解決策です。

OpenGLES 1.1 with FrameBuffer / ColorBuffer / DepthBuffer for Android with NDK r7b

于 2012-05-19T09:08:19.593 に答える