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

Jam*_*shy 5 c++ opengl encryption dds-format

所以我想做的是:

  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中....

非常感谢任何帮助或简短的例子;)

Nic*_*las 3

你需要做两件事。

首先,您必须确保生成此数据的操作的同步和可见性。如果您使用计算着色器将数据生成到 SSBO、缓冲区纹理或其他内容中,那么您需要将glMemoryBarrier, 与该GL_PIXEL_BUFFER_BARRIER_BIT集合一起使用。如果您通过对缓冲区纹理的渲染操作生成此数据,则不需要显式屏障。但如果 FS 正在写入 SSBO 或通过图像加载/存储,您仍然需要如上所述的显式屏障。

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

完成后,您只需将该缓冲区用作像素解包缓冲区,就像任何异步像素传输操作一样。压缩纹理的工作方式与GL_PIXEL_UNPACK_BUFFER未压缩纹理的工作方式相同。

请记住:在 OpenGL 中,所有缓冲区对象都是相同的。OpenGL 并不关心您是否前一分钟将缓冲区用作 SSBO,然后下一分钟将其用于像素传输。只要你同步了,一切都好。