2017-08-15 114 views
1

使用Angle編程UWP應用程序以運行OpenGL ES,我面臨的問題是從幀緩衝區對象讀取的基本操作glReadPixels。 從Visual Studio模板「OpenglES2應用程序(Android,iOS,Windows Universal)」開始,我可以將默認場景渲染檢索到內存緩衝區中。使用OpengGLES2(角度)從幀緩衝區對象中讀取

初始化:

void SimpleRenderer::InitFbo() 
{ 
    int buf_size = tex_height*tex_width * 4; 
    mReadBuf = new char[buf_size]; 
    memset(mReadBuf, 123, buf_size); // arbitrary value to detect changes 
} 

繪圖功能:

void SimpleRenderer::Draw() 
{ 

    // drawing calls here 
    // (...) 

    glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, mReadBuf); 
    // success : mReadBuf is updated with pixel values 
} 

但是,如果我只是創建幀緩衝區對象,試圖在那裏繪製和檢索結果,glReadPixels不返回任何值,並且glError返回INVALID_FRAMEBUFFER_OPERATION

初始化:

void SimpleRenderer::InitFbo() 
{ 
    glGenFramebuffers(1, &mRenderFbo); 
    glGenTextures(1, &mRenderTexture); 
    int buf_size = tex_height*tex_width * 4; 
    char*buf = new char[buf_size]; 
    memset(buf, 255, buf_size); 

    glBindTexture(GL_TEXTURE_2D, mRenderTexture); 
    glTexImage2D(GL_TEXTURE_2D, 0, 4, 
      tex_width, 
      tex_height, 
      0, GL_RGBA, GL_UNSIGNED_BYTE, 
      buf); 

    glBindFramebuffer(GL_FRAMEBUFFER, mRenderFbo); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 
      mRenderTexture, 0); 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    delete[] buf; 

    mReadBuf = new char[buf_size]; 
    memset(mReadBuf, 123, buf_size); 
} 

繪圖功能:

void SimpleRenderer::Draw() 
{ 
    glBindFramebuffer(GL_FRAMEBUFFER, mRenderFbo); 

    // drawing calls here 
    // (...) 

    glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, mReadBuf); 

    // failure : mReadBuf is unchanged 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

*編輯 -解決由於下面的評論。紋理的正確初始化

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
    tex_width, 
    tex_height, 
    0, GL_RGBA, GL_UNSIGNED_BYTE, 
    buf); 

根據記錄,它得到了解決,我檢查與glCheckFramebufferStatus framebuffer的狀態,這回GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT之前。

+0

如果問題的答案完全解決了問題,那麼您應該接受答案(綠色複選標記)。 – Rabbid76

+0

完成;對不起,我到處尋找,但無法找到驗證答案的方法。謝謝你的幫助。 – Alx

回答

1

OpenGL函數glTexImage2D的第三個參數指定了紋理緩衝區的內部格式。

在方法SimpleRenderer::InitFbo中,您將4傳遞給內部格式,該格式不是有效的參數。使用GL_RGBA代替:

glTexImage2D(GL_TEXTURE_2D, 0, 
     GL_RGBA, // <----------------------- 
     tex_width, 
     tex_height, 
     0, GL_RGBA, GL_UNSIGNED_BYTE, 
     buf); 

注意,對於內部格式的Valide參數(在OpenGL ES 2.0)是GL_ALPHAGL_LUMINANCEGL_LUMINANCE_ALPHAGL_RGBGL_RGBA

如果您在撥打glTexImage2D後使用glGetError,則會得到GL_INVALID_VALUE,如果內部格式不是可接受的格式,則會生成GL_INVALID_VALUE。此外,這會導致GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT錯誤(與glCheckFramebufferStatus一起檢查時),如果紋理附加到幀緩衝區並且glReadPixels導致INVALID_FRAMEBUFFER_OPERATION錯誤。