Opengl 使用glReadPixels在内存中映射纹理时发生崩溃

Opengl 使用glReadPixels在内存中映射纹理时发生崩溃,opengl,textures,glreadpixels,Opengl,Textures,Glreadpixels,我正在尝试使用glReadPixels在内存中映射纹理,以便能够使用openGL的不可变存储功能 我使用延迟着色,因此我准备G缓冲区如下: glGenFramebuffers(1,&u gBuffer); glBindFramebuffer(GL_FRAMEBUFFER,_gBuffer); glGenTextures(1和_pos3dTex); glBindTexture(GL_纹理_2D,_pos3dTex); GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA32F,宽度,高度,0

我正在尝试使用glReadPixels在内存中映射纹理,以便能够使用openGL的不可变存储功能

我使用延迟着色,因此我准备G缓冲区如下:

glGenFramebuffers(1,&u gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER,_gBuffer);
glGenTextures(1和_pos3dTex);
glBindTexture(GL_纹理_2D,_pos3dTex);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA32F,宽度,高度,0,GL_RGBA,GL_浮点,NULL);
GLuint布局=glGetFragDataLocation(_progID,“positionTexture”);
...
glFramebufferTexture2D(GL_帧缓冲区、GL_颜色附件0+布局、GL_纹理2D、pos3dTex、0);
...
无符号整数附件[1]={GL_COLOR_ATTACHMENT0+layout};
(1)附件;
glGenRenderbuffers(1,&U深度);
glbinderbuffer(GL_RENDERBUFFER,_rdepth);
GLrenderBuffer存储(GL_RENDERBUFFER、GL_DEPTH_组件、宽度、高度);
glFramebufferRenderbuffer(GL_帧缓冲区、GL_深度附件、GL_渲染缓冲区、GL_深度);
然后我想在内存中映射纹理,以便使用不可变存储:

//绑定数据
glGenBuffers(1,&u pos3dPbo);
glBindBuffer(GL_像素_块_缓冲区,_pos3dPbo);
//宽*高*4(通道)*4(浮子尺寸)
glBufferData(GL像素块缓冲区,宽度*高度*4*4,0,GL流读取);
glBindBuffer(GLU像素块缓冲区,0);
glBindFramebuffer(GL_FRAMEBUFFER,_gBuffer);
glReadBuffer(GL\u COLOR\u ATTACHMENT0+布局);
glPixelStorei(GLU包装校准,4)//4频道
glReadPixels(0,0,宽度,高度,GL_RGBA,GL_FLOAT,NULL);
glBindBuffer(GLU像素块缓冲区,0);
//阅读
glBindBuffer(GL_像素_块_缓冲区,_pos3dPbo);
void*outPos3d=glMapBuffer(GL\u像素\u块\u缓冲区,GL\u只读);
glBindBuffer(GLU像素块缓冲区,0);
//释放
glBindBuffer(GL_像素_块_缓冲区,_pos3dPbo);
glUnmapBuffer(GL像素块缓冲区);
glBindBuffer(GLU像素块缓冲区,0);
在glReadPixels函数之后,我得到了一个“访问冲突”。
我做错了什么?plz?

您正在解除
glReadPixels
之前的
GL\u PIXEL\u PACK\u缓冲区的绑定,因此
NULL
指针将相对于您的客户端内存地址空间进行解释,尝试将数据复制到那里几乎肯定会导致崩溃。

我不确定您实际想做什么(延迟着色不需要回读,也不需要将GBuffer映射到CPU内存,glReadPixels与不可变存储无关),但将NULL作为最后一个参数传递给glReadPixels肯定是错误的。最后一个指针告诉OpenGL它应该将像素数据写入哪里。但是,如果您传递一个空指针,该指针上的每个写操作都将产生访问冲突。
glPixelStorei(GL\u PACK\u ALIGNMENT,4)//4个通道
也很奇怪,因为命令中的4与通道数无关。它定义了从哪个字节对齐行开始。我正在做的是创建一些g缓冲区,完成渲染,然后将纹理数据读回我的CPU应用程序。在GL_STATIC_DRAW中使用glBufferData可以很好地工作,但是我想要更快的读取速度,所以我尝试使用不可变存储(glBufferStorage)。因此,正如我在一些代码中看到的,它们为异步缓冲访问准备了纹理pbo。