如何使用像素缓冲区对象从 GPU 内存读取 3D 纹理

发布于 2024-12-19 18:57:19 字数 431 浏览 1 评论 0原文

我正在将数据从片段着色器内写入 3D 纹理,并且需要将所述数据异步读回到系统内存中。异步启动缓冲区对象打包操作的唯一方法似乎是使用 NULL 指针调用 glReadPixels()。但是这个函数坚持要传递一个定义要读回的区域的矩形。现在我不知道使用 PBO 时是否会忽略这些参数,但我认为不会。在这种情况下,我不知道要传递给该函数什么才能获得整个 3D 纹理。 即使必须读回各个切片(在我看来这有点愚蠢),我仍然不知道如何与 OpenGL 进行通信以读取哪个切片。我错过了什么吗?

顺便说一句,我可以为每个切片使用单独的 2D 纹理,但如果我没记错的话,这会搞砸 (3D-)mipmapping。我想使用 3D mipmap 来有效地找到生成的 3D 纹理中感兴趣的区域。

PS 对次优标签表示抱歉,显然之前没有人询问过 3D 纹理,因为我不允许创建新标签...

I'm writing data into a 3D texture from within a fragment shader, and I need to asynchronously read back said data into system memory. The only means of asynchronously initiating the packing operation into the buffer object seems to be calling glReadPixels() with a NULL pointer. But this function insists on getting passed a rectangle defining the region to read back. Now I don't know if these parameters are ignored when using PBOs, but I assume not. In this case, I have no idea what to pass to this function in order to obtain the whole 3D texture.
Even if have to read back individual slices (which would be kind of stupid IMO), I still have no idea how to communicate to OpenGL which slice to read from. Am I missing something?

BTW, I could use individual 2D textures for every slice, but that would screw up (3D-)mipmapping if I'm not mistaken. I wanted to use the 3D mipmaps in order to efficiently find regions of interest in the resulting 3D texture.

P.S. Sorry for the sub-optimal tags, apparently no one ever asked about 3d textures before and since I'm not allowed to create new tags...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

再可℃爱ぅ一点好了 2024-12-26 18:57:19

谁说 glReadPixels 是读取图像数据的唯一方法?也许在 OpenGL ES 中是这样,但如果你使用 ES,你应该这么说。这个答案的其余部分将假设您正在谈论桌面 GL。

如果您有纹理,并且想要读取其内容,则应该使用 glGetTexImage。控制是否读入缓冲区对象的开关与控制 glReadPixels 的开关相同:缓冲区是否绑定到 GL_PIXEL_PACK_BUFFER

请注意,glGetTexImage 将检索整个纹理(对于给定的 mipmap 级别)。

Who says that glReadPixels is the only way to read image data? Maybe in OpenGL ES it is, but if you're using ES, you should say so. The rest of this answer will be assuming you're talking about desktop GL.

If you have a texture, and you want to read its contents, you should use glGetTexImage. The switch that controls whether it reads into a buffer object or not is the same switch that controls it for glReadPixels: whether a buffer is bound to GL_PIXEL_PACK_BUFFER.

Note that glGetTexImage will retrieve the entire texture (for a given mipmap level).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文