1

フレームバッファを使用して、ビデオ レンダラーで後処理シェーダーを実行しています。シェーダーの 1 つはルックアップが非常に多いため、輝度のみのフレーム バッファーに変更して速度を上げたいと考えています。初期化でglTexImage2D呼び出しをRGBAからLUMINANCEに変更しようとしましたが、「onDrawFrame」でバッファをアタッチしようとするとエラーが発生します。

問題は、例からコードをまとめてハッキングしたため、それが行っているすべてのことを完全に理解していないことです。1 つには、深度アタッチメントも作成しています。ビデオをレンダリングしているため、深度情報は必要ありませんが、それを無効にできるかどうかはわかりません。とにかく、onSurfaceCreated での FBO の初期化は次のとおりです。

        GLES20.glGenTextures(1, renTex, 0);

        // generate
        GLES20.glGenFramebuffers(1, fb2, 0);
        GLES20.glActiveTexture(GLES20.GL_TEXTURE4);

        // generate color texture
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renTex[0]);

        // parameters
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);

        // create it 
        // create an empty intbuffer first?
        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texW, texH, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, texBuffer);
        //**THIS WORKS AS IS, CHANGING FROM RGBA TO LUMINANCE BREAKS IT**

        // create render buffer and bind 16-bit depth buffer
        GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthRb[0]);
        GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, texW, texH);

onDrawFrame でバッファをアタッチするコードは次のとおりです。

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[0]);
    // specify texture as color attachment
    GLES20.glViewport(0, 0, w, h);
    Matrix.frustumM(mProjMatrix, 0, -.30f, .30f, -.30f, .30f, 3, 7);


    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renTex[0], 0);
    // attach render buffer as depth buffer


    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, depthRb[0]);
    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
    if (status != GLES20.GL_FRAMEBUFFER_COMPLETE)
        System.out.println("Frame buffer not obtained :(");
//This works for RGBA but returns an error for LUMINANCE

誰にも何か提案がありますか?また、深度バッファコンポーネントを捨てることはできますか、それとも必須ですか

4

2 に答える 2

1

GL_LUMINANCE はカラー レンダリング可能な形式ではありません。OpenGL ES 2.0 仕様セクション 4.4.5から:

圧縮された内部形式を含む、表 4.5 にリストされていない形式。含まれているコンポーネントに関係なく、色、深度、またはステンシル レンダリング可能ではありません。

表にリストされているカラー レンダリング可能な形式は、RGBA4、RGB5_A1、および RGB565 です。

RGB8 と RGBA8 も表に記載されていませんが、RGBA8 を使用できるため、デバイスはおそらく OES_rgb8_rgba8 および/または ARM_rgba8 拡張機能をサポートしています。

于 2013-09-08T18:56:43.387 に答える
0

フレーム バッファ ターゲットとして 2 つのテクスチャを使用します。1 つは Y 平面用の GL_RED_EXT 形式で、もう 1 つは UV 平面用の GL_RG_EXT 形式です。2 番目のテクスチャは最初のサイズの半分になるため、異なる COLOR_ATTACHMENTS に一度に割り当てることはできず、異なるビューポートでもレンダリングを 2 回行う必要があります。

 #include "gl2ext.h" 

...
    glGenTextures(1, &mYTextureId);
    glBindTexture(GL_TEXTURE_2D, mYTextureId);
...
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, mCameraFrameWidth, mCameraFrameHeight, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, NULL);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mYTextureId, 0);
    glViewport(0, 0, mCameraFrameWidth, mCameraFrameHeight);
...

    glGenTextures(1, &mUVTextureId);
    glBindTexture(GL_TEXTURE_2D, mUVTextureId);
...
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, mCameraFrameWidth/2, mCameraFrameHeight/2, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, NULL);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mUVTextureId, 0);
    glViewport(0, 0, mCameraFrameWidth/2, mCameraFrameHeight/2);
...

これは、arm7 以降を搭載したほとんどの iPhone および Android スマートフォンで動作します。

于 2017-01-06T19:03:13.703 に答える