Arrays OpenGL-glReadPixels返回不正确的值
我可能遗漏了一些明显的东西,但我找不到代码有任何错误。它用于测试目的,它所要做的就是将所有像素的颜色设置为白色并读取像素信息。结果是一个充满0的数组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
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,但在开始绘制之前,永远不要清除它。禁用深度测试并从帧缓冲区中删除深度附件没有帮助。此代码出现时是否启用深度测试