5

所以我想做的是:

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

非常感谢您提供任何帮助或简短示例;)

4

2 回答 2

3

你需要做两件事。

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

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

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

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

于 2016-08-31T14:13:39.897 回答
1

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

在此处阅读有关 PBO的更多信息。

于 2016-08-31T13:56:31.227 回答