1

アプリケーションをframebuffer/renderbufferオブジェクトの使用に切り替えようとしています(後でテクスチャにレンダリングするように見えます)が、framebuffer / renderbufferを使用すると、何もレンダリングされません。デフォルトのフレームバッファをオンのままにすると、デフォルトと同様に、正常にレンダリングされます。すべての色、深度、およびステンシル関連の機能は、期待どおりに機能します。

初期化コード:

if(frameBuffer == 0 || !GLES20.glIsFramebuffer(frameBuffer)){
    int[] retVal = new int[1];
    GLES20.glGenFramebuffers(1, retVal, 0);
    frameBuffer = retVal[0];
    retVal[0] = 0;

    if(renderBufferColour != 0 || !GLES20.glIsRenderbuffer(renderBufferColour)){
        GLES20.glGenRenderbuffers(1, retVal, 0);
        renderBufferColour = retVal[0];
    }

    if(renderBufferDepth != 0 || !GLES20.glIsRenderbuffer(renderBufferDepth)){
        GLES20.glGenRenderbuffers(1, retVal, 0);
        renderBufferDepth = retVal[0];
    }

    if(renderBufferStencil != 0 || !GLES20.glIsRenderbuffer(renderBufferStencil)){
        GLES20.glGenRenderbuffers(1, retVal, 0);
        renderBufferStencil = retVal[0];
    }
}

フレームバッファ有効化コード(これをコメントアウトすると、デフォルトのバッファを使用したレンダリングが可能になります):

GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBuffer);

GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderBufferColour);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_RGBA4, width, height);
GLES20.glFramebufferRenderbuffer(
        GLES20.GL_FRAMEBUFFER,
        GLES20.GL_COLOR_ATTACHMENT0,
        GLES20.GL_RENDERBUFFER,
        renderBufferColour);

GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderBufferDepth);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, width, height);
GLES20.glFramebufferRenderbuffer(
        GLES20.GL_FRAMEBUFFER,
        GLES20.GL_DEPTH_ATTACHMENT,
        GLES20.GL_RENDERBUFFER,
        renderBufferDepth);

GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderBufferStencil);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_STENCIL_INDEX8, width, height);
GLES20.glFramebufferRenderbuffer(
        GLES20.GL_FRAMEBUFFER,
        GLES20.GL_STENCIL_ATTACHMENT,
        GLES20.GL_RENDERBUFFER,
        renderBufferStencil);

if (GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER) != GLES20.GL_FRAMEBUFFER_COMPLETE)
    throw new RuntimeException(String.format("Failed to make complete framebuffer object %x", GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER)));

最後の例外はスローされずglGetError()、各ステップの後にチェックするときにエラーは返されません。ここで何かが足りませんか?

4

1 に答える 1

2

わかりました、OpenGLES 2.0 マニュアルを読んだ後、次の段落に出くわしました。

By allowing the images of a renderbuffer to be attached to a framebuffer,
OpenGL ES provides a mechanism to support off-screen rendering. Further, by
allowing the images of a texture to be attached to a framebuffer, OpenGL ES provides
a mechanism to support render to texture.

アプリケーションのレンダー バッファは、予想していたように、画面上ではなく常に画面外にあるように見えます。これが、正しく読んだ場合、画面に画像がない理由です。

于 2012-09-07T02:55:11.990 に答える