2012-10-19 209 views
3

我渲染到幀緩衝區,然後我想用它作爲紋理。OpenGL渲染到紋理 - 黑屏

我可以使用glReadPixels將幀緩衝區保存到一個文件,所以我確信我正在渲染OK。

我可以綁定到固定紋理並渲染那個確定。

但我不能綁定到幀緩衝區來渲染,而不是固定的紋理。

//setup: 
private void setupRenderToTexture() { 
    fb = new int[numberOfBuffers]; 
    depthRb = new int[numberOfBuffers]; 
    renderTex = new int[numberOfBuffers]; 
    texBuffer = new IntBuffer[numberOfBuffers]; 

    // generate 
    GLES20.glGenFramebuffers(fb.length, fb, 0); 
    GLES20.glGenRenderbuffers(depthRb.length, depthRb, 0); 
    GLES20.glGenTextures(renderTex.length, renderTex, 0); 

    GLErrorHandler.checkGlError("glGenFramebuffers"); 

    for (int i = 0; i < fb.length; i++) { 
     GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[i]); 

     // generate color texture 
     GLState.Instance.bindTexture(0, renderTex[i]); 

     // parameters 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
     // GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
       GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
     // GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 
       GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); 
     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); 

     // create it 
     // create an empty intbuffer first? 
     int[] fileData = new int[width * height]; 
     texBuffer[i] = IntBuffer.wrap(fileData); 
     GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, 
       height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, 
       texBuffer[i]); 

     GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, 
       renderTex[i], 0); 

     // create render buffer and bind 16-bit depth buffer 
     GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthRb[i]); 
     GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, 
       GLES20.GL_DEPTH_COMPONENT16, width, height); 
     GLErrorHandler.checkGlError("glRenderbufferStorage or above"); 
    } 


    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
} 

使用幀緩衝:

GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[0]); 

保存幀緩衝(用於測試):

GLES20.glReadPixels(sourceX, sourceY, width, height, GL10.GL_RGBA, 
GL10.GL_UNSIGNED_BYTE, ib); 

然後渲染到屏幕:

GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[0]); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture); //some simple texture works but: 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTex[0]); //frame buffer texture does not work 

所有我如果我綁定到,get是一個黑屏

+0

也許你的問題是類似於這[一個](http://stackoverflow.com/questions/6802266/how-to-use-glreadpixels-with-android-usually-get-zeros) –

+0

@ FabienR沒有幫助,但謝謝你! – weston

回答

2

您錯誤地使用FBO。你必須附上一個空的紋理,以便它可以渲染到它。 看到這page

+0

謝謝,我會給你一個鏡頭。 – weston