2014-01-21 26 views
1

這只是分享一些花了很長時間才弄清楚的東西。如果您不需要Depthbuffer或在EGL中沒有深度緩衝區附加點設置,這可能會有所幫助。glCheckFramebufferStatus返回36054 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

出於某種原因,我沒能渲染到紋理工作渲染緩衝器對象RBO設置爲深度緩衝:像這樣

GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, 
      juliaTex[0], 0); 
    rain.checkGlError("glFramebufferTexture2D"); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, 
      juliaRBO[0]); 
    rain.checkGlError("glFramebufferRenderbuffer"); 

    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER); 

導致錯誤status == GLES20.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

如果我改變渲染緩衝存儲器來GLES20.GL_RGBA4,而不是GLES20.DEPTH_COMPONENT16,改變GLES20.GL_DEPTH_ATTACHMENTGLES20.GL_COLOR_ATTACHMENT0然後錯誤消失,

更改此

// create render buffer and bind 16-bit depth buffer 
    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, juliaRBO[0]); 
    rain.checkGlError("glBindRenderBuffer"); 
    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.DEPTH_COMPONENT16, 
      rain.width, rain.height); 

這個

// create render buffer and bind 16-bit depth buffer 
    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, juliaRBO[0]); 
    rain.checkGlError("glBindRenderBuffer"); 
    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_RGBA4, 
      rain.width, rain.height); 

和原來的代碼如下:

GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, 
      juliaTex[0], 0); 
    rain.checkGlError("glFramebufferTexture2D"); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_RENDERBUFFER, 
      juliaRBO[0]); 
    rain.checkGlError("glFramebufferRenderbuffer"); 

然後status == GLES20.GL_FRAMEBUFFER_COMPLETE

但質地是空的。

這裏是調用創建存儲紋理

// bind texture 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, juliaTex[0]); 

    // clamp texture to edges 
    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_LINEAR); 
    rain.checkGlError("glTexParameter JuliaTex"); 

    // create it 
    /* 
    int[] buf = new int[rain.width * rain.height]; 
    juliaTexBuff = ByteBuffer.allocateDirect(buf.length 
      * rain.FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asIntBuffer(); 
    */ 
    // generate the textures 
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 
      rain.width, rain.height, 0, GLES20.GL_RGBA, 
      GLES20.GL_UNSIGNED_SHORT_4_4_4_4, null); 

回答

-3

爲了得到這個除了工作,以渲染緩衝器安裝到附色點我換幀緩衝區附件的順序:

GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_RENDERBUFFER, 
      juliaRBO[0]); 
    rain.checkGlError("glFramebufferRenderbuffer"); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, 
      juliaTex[0], 0); 
    rain.checkGlError("glFramebufferTexture2D"); 

因此Texture2D被附加到Renderbuffer之後的Framebuffer顏色層。我假定最後一個連接點是OpenGL ES使用的點。

+0

** - 1 **:您做的不僅僅是在此代碼中最後添加紋理。您實際上已將您的渲染緩衝區附加到附加點** 0 **,然後用您的紋理圖像替換該附件。這與您最初嘗試的方式有很大不同。請更新您的問題,以展示如何爲您的紋理和渲染緩衝區分配存儲空間,因爲這幾乎可以肯定您的錯誤實際上來自哪裏。有了這個當前的設置,你沒有深度緩衝區。 –

+0

我不認爲我的EGL設置有深度緩衝區連接點。這是導致錯誤的原因。你可能比我更瞭解這件事情,這個解決方案可能看起來很愚蠢,但這只是一種解決方法,它可能會幫助更多的黑客,而不是搞亂深度組件附件點。給他自己的每個人 – HPP

+0

所有的FBO都有一個深度緩衝區附着點,但是您允許在那裏附着的RBO /紋理圖像的格式和尺寸可能非常有限。我現在可以看到的主要問題是,您的紋理'juliaTex [0]'可能與您的RBO尺寸不同,這就是爲什麼我要求查看您如何爲該紋理分配存儲。沒有理由甚至創建/附加RBO,正在做你現在正在做的事情,因爲你立即在RBO上綁定了其他的東西。 –