C++ 使用OpengGLES2(角度)从帧缓冲区对象读取

C++ 使用OpengGLES2(角度)从帧缓冲区对象读取,c++,uwp,opengl-es,textures,opengl-es-2.0,C++,Uwp,Opengl Es,Textures,Opengl Es 2.0,使用Angle编程UWP应用程序以运行OpenGL ES,我面临一个问题,即使用glReadPixels从帧缓冲区对象读取的基本操作。 从VisualStudio模板“OpenglES2应用程序(Android、iOS、Windows Universal)”开始,我可以将默认场景渲染检索到内存缓冲区中 初始化: void SimpleRenderer::InitFbo() { int buf_size = tex_height*tex_width * 4; mReadBuf =

使用Angle编程UWP应用程序以运行OpenGL ES,我面临一个问题,即使用
glReadPixels
从帧缓冲区对象读取的基本操作。 从VisualStudio模板“OpenglES2应用程序(Android、iOS、Windows Universal)”开始,我可以将默认场景渲染检索到内存缓冲区中

初始化:

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::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()
{

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

    glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, mReadBuf);
    // success : mReadBuf is updated with pixel values
}
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);
}
但是如果我只是创建一个帧缓冲区对象,尝试在那里绘制并检索结果,
glReadPixels
不返回任何值,
glError
返回
无效的\u帧缓冲区\u操作

初始化:

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::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()
{

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

    glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, mReadBuf);
    // success : mReadBuf is updated with pixel values
}
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
检查帧缓冲区状态,它返回
GL\u framebuffer\u complete\u ATTACHMENT
OpenGL函数的第三个参数指定纹理缓冲区的内部格式

在方法
SimpleRenderer::InitFbo
中,将
4
传递给内部格式,该格式不是有效的参数。改用
GL\u RGBA

glTexImage2D(GL_TEXTURE_2D, 0, 
        GL_RGBA,   // <-----------------------
        tex_width,
        tex_height,
        0, GL_RGBA, GL_UNSIGNED_BYTE,
        buf);
glTexImage2D(GL_纹理_2D,0,

GL_RGBA,//完成;对不起,我到处找,但找不到验证答案的方法。谢谢你的帮助。