如何在没有 CPU 副本的情况下上传从 GPU 操作生成的 DXT5 压缩像素数据?

How to upload DXT5 compressed pixel data generated from a GPU operation without a CPU copy?

所以我想做的是:

  1. 将使用任何算法(在我的例子中是 AES-256)加密的文件加载到 GPU 内存(使用 CUDA)中。

  2. 用我们现在拥有的所有 GPU 并行能力解密文件,让它留在 GPU 内存中。

  3. 现在告诉OpenGL(4.3)内存中有一个纹理需要从DDS DXT5中读取并解压。

第3点是我有疑问的地方。由于要在 OpenGL 中加载压缩的 DDS DXT5,必须使用压缩类型 (GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) 和指向图像数据缓冲区的指针调用 openGL::glCompressedTexImage[+ 2D|3D|2DARB...]。

所以,简而言之 -> 有没有办法将 GPU 内存中已有的纹理缓冲区地址传递给 OpenGL(DDS 格式)?如果没有这个选项,我需要将 AES 解密文件传输回 CPU 并告诉 OpenGL 将其再次加载到 GPU 中....

非常感谢您的帮助或简短的示例;)

将您的缓冲区绑定到 GL_PIXEL_UNPACK_BUFFER 并调用 glCompressedTexSubImage2D 并将 data 作为缓冲区的偏移量。

详细了解 PBO here

你需要做两件事。

首先,您必须确保生成此数据的操作的同步性和可见性。如果您使用 compute shader 将数据生成到 SSBO、缓冲区纹理或其他任何内容,那么您将需要使用 glMemoryBarrier,并设置 GL_PIXEL_BUFFER_BARRIER_BIT。如果您通过对缓冲区纹理的渲染操作生成此数据,则不需要显式屏障。但是,如果 FS 正在写入 SSBO 或通过图像 load/store,您仍然需要如上所述的显式屏障。

如果您使用的是 OpenCL,则必须使用 OpenCL 的 OpenGL 互操作功能来使 CL 操作的结果对 GL 可见。

完成后,您只需将缓冲区用作像素解压缩缓冲区,就像您对任何 asynchronous pixel transfer operation 所做的那样。压缩纹理与 GL_PIXEL_UNPACK_BUFFER 一起使用就像未压缩的纹理一样。

记住:在 OpenGL 中,所有缓冲区对象相同。 OpenGL 不关心您是否在一分钟内将缓冲区用作 SSBO,然后在下一分钟将其用于像素传输。只要你同步了就万事大吉