Как загрузить сжатые пиксельные данные DXT5, сгенерированные при работе с графическим процессором, без копии процессора?

Итак, что я хочу сделать, это:

  1. Загрузите файл, зашифрованный любым алгоритмом (в моем случае AES-256) в память GPU (с помощью CUDA).

  2. Расшифруйте файл, используя все параллельные возможности GPU, которые у нас есть, и оставьте его в памяти GPU.

  3. Теперь скажите OpenGL (4.3), что в памяти есть текстура, которую нужно прочитать и распаковать из DDS DXT5.

Точка 3, где у меня есть сомнения. Поскольку для загрузки сжатого DDS DXT5 в OpenGL необходимо вызвать openGL :: glCompressedTexImage [+ 2D | 3D | 2DARB …] с типом сжатия (GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) и указателем на буфер данных изображения.

Итак, для краткости -> есть ли способ передать адрес буфера текстуры уже в памяти GPU в OpenGL (в формате DDS)? Без этой опции мне нужно было бы перенести расшифрованный файл AES обратно в ЦП и сказать OpenGL загрузить его снова в графический процессор ….

Большое спасибо за любую помощь или короткие примеры;)

5

Решение

Вам нужно сделать две вещи.

Во-первых, вы должны обеспечить синхронизацию и видимость для операции, которая генерирует эти данные. Если вы используете вычислить шейдер чтобы сгенерировать данные в SSBO, буферную текстуру или что-то еще, вам нужно будет использовать glMemoryBarrierс GL_PIXEL_BUFFER_BARRIER_BIT задавать. Если вы генерируете эти данные с помощью операции рендеринга в буферную текстуру, вам не понадобится явный барьер. Но если FS пишет в SSBO или через загрузку / хранение изображений, вам все равно понадобится явный барьер, как описано выше.

Если вы используете OpenCL, то вам придется использовать функциональность взаимодействия OpenCLL OpenCL, чтобы сделать результат операции CL видимым для GL.

Как только это будет сделано, вы просто используете буфер в качестве буфера распаковки пикселей, как и для любого операция асинхронной передачи пикселей. Сжатые текстуры работают с GL_PIXEL_UNPACK_BUFFER как несжатые.

Помните: в OpenGL все объекты буфера тот же самый. OpenGL не волнует, если вы будете использовать буфер в качестве SSBO одну минуту, а затем использовать его для передачи пикселей в следующую. Пока вы синхронизируете это, все в порядке.

3

Другие решения

Свяжите свой буфер с GL_PIXEL_UNPACK_BUFFER и позвонить glCompressedTexSubImage2D с data быть смещением в буфер.

Узнайте больше о PBO Вот.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector