opengl - 使用 glReadPixels 在内存中映射纹理时发生崩溃
问题描述
我正在尝试使用 glReadPixels 在内存中映射纹理,以便能够使用 openGL 的不可变存储功能。
我正在使用延迟着色,所以我准备 G-Buffers 如下:
glGenFramebuffers(1, &_gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _gBuffer);
glGenTextures(1, &_pos3dTex);
glBindTexture(GL_TEXTURE_2D, _pos3dTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
GLuint layout = glGetFragDataLocation(_progID, "positionTexture");
...
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + layout, GL_TEXTURE_2D, _pos3dTex, 0);
...
unsigned int attachments[1] = { GL_COLOR_ATTACHMENT0 + layout };
glDrawBuffers(1, attachments);
glGenRenderbuffers(1, &_rboDepth);
glBindRenderbuffer(GL_RENDERBUFFER, _rboDepth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _rboDepth);
然后我想将我的纹理映射到内存中,这样我就可以使用不可变存储:
//Bind Data
glGenBuffers(1, &_pos3dPbo);
glBindBuffer(GL_PIXEL_PACK_BUFFER, _pos3dPbo);
//w*h*4 (Channels)*4(size of float)
glBufferData(GL_PIXEL_PACK_BUFFER,width*height*4* 4, 0, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
glBindFramebuffer(GL_FRAMEBUFFER, _gBuffer);
glReadBuffer(GL_COLOR_ATTACHMENT0 + layout);
glPixelStorei(GL_PACK_ALIGNMENT, 4);//4 channels
glReadPixels(0, 0, width, height, GL_RGBA,GL_FLOAT,NULL);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
//Reading
glBindBuffer(GL_PIXEL_PACK_BUFFER, _pos3dPbo);
void* outPos3d = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
//Releasing
glBindBuffer(GL_PIXEL_PACK_BUFFER, _pos3dPbo);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
在 glReadPixels 函数之后,我收到“访问冲突”。我做错了什么?
解决方案
您在GL_PIXEL_PACK_BUFFER
之前取消绑定glReadPixels
,因此NULL
指针将相对于您的客户端内存地址空间进行解释,并且尝试将数据复制到那里几乎肯定会导致崩溃。
推荐阅读
- php - Laravel 7 Api auth 总是返回 false
- javascript - 防止数据表默认排序
- html - 空标题能否通过可访问性测试
- java - 使用java从浏览器运行用户系统中的exe文件
- python - 计算多维numpy数组元素的内点积
- php - 如何使用带有自定义字段标题的 wp_list_pages() 函数从自定义帖子类型中列出帖子?
- c - 基本 shell 实现 - 打开:权限被拒绝
- .net - 无法在 Visual Studio 2019 中打开 WPF 解决方案
- xml - PowerShell - 不区分大小写的 XML 属性名称的 xpath
- python - 我的帐户创建程序在第一次验证后不验证输入,有没有更有效的方法?