Arrays OpenGL-glReadPixels返回不正确的值

Arrays OpenGL-glReadPixels返回不正确的值,arrays,opengl,pixels,Arrays,Opengl,Pixels,我可能遗漏了一些明显的东西,但我找不到代码有任何错误。它用于测试目的,它所要做的就是将所有像素的颜色设置为白色并读取像素信息。结果是一个充满0的数组 unsigned int frameBuffer; glGenFramebuffers(1,&frameBuffer); unsigned int texture; unsigned int depthTexture; glGenTextures(1,&texture); glGenT

我可能遗漏了一些明显的东西,但我找不到代码有任何错误。它用于测试目的,它所要做的就是将所有像素的颜色设置为白色并读取像素信息。结果是一个充满0的数组

    unsigned int frameBuffer;
    glGenFramebuffers(1,&frameBuffer);
    unsigned int texture;
    unsigned int depthTexture;
    glGenTextures(1,&texture);
    glGenTextures(1,&depthTexture);

    glBindFramebuffer(GL_FRAMEBUFFER,frameBuffer);
    glBindTexture(GL_TEXTURE_2D,texture);

    int w = 256;
    int h = 256;

    glTexImage2D(
        GL_TEXTURE_2D,
        0,
        GL_RGB,
        w,h,
        0,GL_RGB,
        GL_UNSIGNED_BYTE,
        0
    );
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
    glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,texture,0);

    glBindTexture(GL_TEXTURE_2D,depthTexture);
    glTexImage2D(
        GL_TEXTURE_2D,
        0,
        GL_DEPTH_COMPONENT16,
        w,h,
        0,GL_DEPTH_COMPONENT,
        GL_FLOAT,
        0
    );
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
    glFramebufferTexture2D(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_TEXTURE_2D,depthTexture,0);

    int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(status == GL_FRAMEBUFFER_COMPLETE)
    {
        unsigned char *pixels = new unsigned char[w *h *3];
        for(unsigned int i=0;i<(w *h *3);i++)
            pixels[i] = 255;
        glDrawPixels(w,h,GL_RGB,GL_UNSIGNED_BYTE,&pixels[0]);
        glReadPixels(0,0,w,h,GL_RGB,GL_UNSIGNED_BYTE,&pixels[0]);
        for(unsigned int i=0; i<(w *h *3); i+=3)
        {
            unsigned int r = pixels[i];
            unsigned int g = pixels[i + 1];
            unsigned int b = pixels[i + 2];
            std::cout<<i<<": "<<r<<","<<g<<","<<b<<std::endl;
        }
        delete[] pixels;
        int err = glGetError(); // No error reported
    }
    glBindTexture(0,GL_TEXTURE_2D);
    glBindFramebuffer(0,GL_FRAMEBUFFER);
无符号整数帧缓冲区;
GLGEN帧缓冲区(1和帧缓冲区);
无符号整数纹理;
无符号整数深度纹理;
glGenTextures(1,&纹理);
glGenTextures(1和深度纹理);
glBindFramebuffer(GL_FRAMEBUFFER,FRAMEBUFFER);
glBindTexture(GL_TEXTURE_2D,纹理);
int w=256;
int h=256;
glTexImage2D(
GL_纹理_2D,
0,
德国劳埃德大学,
w、 h,,
0,GL_RGB,
GL_无符号字节,
0
);
glTexParameteri(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近);
glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glFramebufferTexture2D(GL_帧缓冲区,GL_颜色,GL_附件0,GL_纹理,GL_2D,纹理,0);
glBindTexture(GL_纹理_2D,深度纹理);
glTexImage2D(
GL_纹理_2D,
0,
GL_深度_组件16,
w、 h,,
0,总图深度分量,
浮球,
0
);
glTexParameteri(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近);
glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glFramebufferTexture2D(GL_帧缓冲区、GL_深度_附件、GL_纹理_2D、深度纹理,0);
int status=glCheckFramebufferStatus(GL_FRAMEBUFFER);
如果(状态==GL\U帧缓冲区\U完成)
{
无符号字符*像素=新的无符号字符[w*h*3];

对于(unsigned int i=0;i尝试在调用之前确保光栅位置对有效:

glRasterPos(0,0);
glDrawPixels(w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels);
glReadPixels(0,0,w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels);

在调用之前,请尝试确保光栅位置对有效:

glRasterPos(0,0);
glDrawPixels(w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels);
glReadPixels(0,0,w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels);

在调用之前,请尝试确保光栅位置对有效:

glRasterPos(0,0);
glDrawPixels(w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels);
glReadPixels(0,0,w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels);

在调用之前,请尝试确保光栅位置对有效:

glRasterPos(0,0);
glDrawPixels(w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels);
glReadPixels(0,0,w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels);

有人在另一个论坛上找到了原因

解决办法是打电话

glReadBuffer(GL_COLOR_ATTACHMENT0);
在调用glReadPixels之前,以及

glReadBuffer(GL_BACK);

之后,重新设置它。

有人在另一个论坛上找到了原因

解决办法是打电话

glReadBuffer(GL_COLOR_ATTACHMENT0);
在调用glReadPixels之前,以及

glReadBuffer(GL_BACK);

之后,重新设置它。

有人在另一个论坛上找到了原因

解决办法是打电话

glReadBuffer(GL_COLOR_ATTACHMENT0);
在调用glReadPixels之前,以及

glReadBuffer(GL_BACK);

之后,重新设置它。

有人在另一个论坛上找到了原因

解决办法是打电话

glReadBuffer(GL_COLOR_ATTACHMENT0);
在调用glReadPixels之前,以及

glReadBuffer(GL_BACK);


然后,重置它。

我尝试使用glRasterPos2f(0.f,0.f);在draw/read调用之前,但没有任何更改。如果读取draw和read调用之间的像素,它们仍然都是0吗?我不知道是read还是draw将它们设置为255以外的值否,draw和read调用之间的值与我指定的值相同,因此是read调用将它们更改为0。您可以尝试
glWindowPos2f(0.0f,0.0f)
而不是
glRasterPos
。如果设置了转换,它们将应用于传递给
glRasterPos
的位置,在本例中,您不希望这样。我尝试使用了glRasterPos2f(0.f,0.f);在draw/read调用之前,但没有任何更改。如果读取draw和read调用之间的像素,它们仍然都是0吗?我不知道是read还是draw将它们设置为255以外的值否,draw和read调用之间的值与我指定的值相同,因此是read调用将它们更改为0。您可以尝试
glWindowPos2f(0.0f,0.0f)
而不是
glRasterPos
。如果设置了转换,它们将应用于传递给
glRasterPos
的位置,在本例中,您不希望这样。我尝试使用了glRasterPos2f(0.f,0.f);在draw/read调用之前,但没有任何更改。如果读取draw和read调用之间的像素,它们仍然都是0吗?我不知道是read还是draw将它们设置为255以外的值否,draw和read调用之间的值与我指定的值相同,因此是read调用将它们更改为0。您可以尝试
glWindowPos2f(0.0f,0.0f)
而不是
glRasterPos
。如果设置了转换,它们将应用于传递给
glRasterPos
的位置,在本例中,您不希望这样。我尝试使用了glRasterPos2f(0.f,0.f);在draw/read调用之前,但没有任何更改。如果读取draw和read调用之间的像素,它们仍然都是0吗?我不知道是read还是draw将它们设置为255以外的值否,draw和read调用之间的值与我指定的值相同,因此是read调用将它们更改为0。您可以尝试
glWindowPos2f(0.0f,0.0f)
而不是
glRasterPos
。如果设置了转换,它们将应用于传递到
glRasterPos
的位置,在这种情况下,您不希望这样做。执行此代码时是否启用深度测试?您向FBO添加深度缓冲区,但在开始绘制之前从不清除它。禁用深度测试和r从帧缓冲区中删除深度附件没有帮助。执行此代码时是否启用深度测试?向FBO添加深度缓冲区,但在开始绘制之前从不清除深度缓冲区。禁用深度测试并从帧缓冲区中删除深度附件没有帮助。执行此代码时是否启用深度测试?您需要将深度缓冲区添加到FBO,但在开始绘制之前,永远不要清除它。禁用深度测试并从帧缓冲区中删除深度附件没有帮助。此代码出现时是否启用深度测试