使用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
之前。
如果問題的答案完全解決了問題,那麼您應該接受答案(綠色複選標記)。 – Rabbid76
完成;對不起,我到處尋找,但無法找到驗證答案的方法。謝謝你的幫助。 – Alx