15

OpenGLES1.1およびOpenGLES2.0をサポートするFroyoを実行しているAndroidデバイスを使用しています

デプスバッファをテクスチャにレンダリングしたい。他のプラットフォーム(iPhoneを含む)でのOpenGL、OpenGL ESの例をいくつか見てきたので、私はいくつかのFBO構成を試しました。

カラーテクスチャを使用したFBOセットアップを取得できるようですが、デプステクスチャをアタッチするたびに失敗します。

私の現在のコードはこの例に基づいていますが、描画バッファと読み取りバッファをnoneに設定する代わりに、カラーテクスチャも作成しています。

テクスチャに奥行きをレンダリングするようにAndroidでOpenGLESFBOを構成する簡単な例はありますか?または、サポートされているものとサポートされていないものを説明するドキュメントはありますか?


コメントありがとうございます-Androidで見つけて動作する場合は、ES1.1のソリューションが特に必要でした。ES 2も見てみたいです。深度情報をカラーバッファにパックするというアイデアが理解できません。アイデアをよりよく理解するために参照できるリファレンスはありますか?

コードに関して-私のソースは私が上に投稿したリンクとほとんど変わりません。フレームバッファのステータスは、完了していません。


フラグメントシェーダーの提案をありがとう-私は今アイデアを得る。別の解決策を機能させることができない場合は、それを検討します。私の理想は、深さと色を同時に取得することです。私がそれを助けることができれば、色と深さを別々にレンダリングしたくはありません。

4

2 に答える 2

17

OK、ある種の答え。これは、OpenGL ES 2 を搭載した Android 2.2 で動作するようになりました。

    // Create a frame buffer
    glGenFramebuffers( 1, &(frame_buffer ) );

    // Generate a texture to hold the colour buffer
    glGenTextures(1, &(colour_texture) );
    glBindTexture(GL_TEXTURE_2D, colour_texture);
    // Width and height do not have to be a power of two
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
            pixelWidth, pixelHeight,
            0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    // Probably just paranoia
    glBindTexture(GL_TEXTURE_2D, 0);

    // Create a texture to hold the depth buffer
    glGenTextures(1, &(depth_texture) );
    glBindTexture(GL_TEXTURE_2D, depth_texture);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
            pixelWidth, pixelHeight,
            0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glBindTexture(GL_TEXTURE_2D, 0);        

    glBindFramebuffer(GL_FRAMEBUFFER, frame_buffer);

    // Associate the textures with the FBO.

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                    GL_TEXTURE_2D, colour_texture, 0);

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                    GL_TEXTURE_2D, depth_texture, 0);

    // Check FBO status.    
    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

    if ( status == GL_FRAMEBUFFER_COMPLETE )
    {
        // Success
    }

本当に些細なことですが、OpenGL ES2 のマニュアルに従って、正しい順序ですべてを実行してください。

フレーム バッファ オブジェクトは拡張であるため、必要な関数呼び出しに OES を追加し、定数に _OES を追加して、OpenGL ES 1.1 でこれを試しました。デプス テクスチャをフレーム バッファにアタッチしようとすると、フレーム バッファ オブジェクトが不完全になります。

したがって、現時点での私の結論は、これは Android の OpenGL ES 1.1 では機能しないということですが、ES 2.2 では明らかに機能します。

誰かが ES 1.1 の解決策を持っているなら、それを見るのは興味深いでしょう。

于 2010-11-26T15:27:51.210 に答える
0

深度テクスチャへのレンダリングは、多くのデバイスではサポートされていません。深度バッファ用のレンダバッファをアタッチする必要があります。

于 2012-04-13T22:08:53.710 に答える