2016-08-31 4 views
5

だから、私は何をしたいです:CPUコピーをしないGPU操作から生成されたDXT5圧縮ピクセルデータをアップロードするにはどうすればよいですか?

  1. は(CUDAと)GPUメモリに(私の場合、AES-256で)任意のアルゴリズムで暗号化したファイルをロードします。

  2. 私たちが現在持っているすべてのGPU並列awesomenessでファイルを復号化し、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にファイルを復号化し転送し、GPUに再びそれをロードするためにOpenGLを伝える必要があるでしょう....任意のヘルプや短い例について

感謝を;)

+0

これは良い考えではありません。まず、ファイルを復号化をパラレルでサポートするブロック連鎖モードで暗号化していることを確認する必要があります(並列処理はGPU全体で行われます)。次に、テクスチャは、GPU上のすべてをセットアップして時間を節約するためのオーバーヘッドに十分な大きさでなければなりません。さらに、CPUはAES用の専用ハードウェアを備えています。 GPUはそうしない。 –

+1

@ColonelThirtyTwo:それらのどれも彼が求めているものではありません。 AES崩壊などは無関係のノイズです。質問は、圧縮されたテクスチャデータを生成するGPU操作(AESは生成される方法ですが、これはもう重要ではありません)がCPUにコピーされずにOpenGLテクスチャに格納できるかどうかという点で、問題はよく焦点を当てています。ちょうど騒々しい。 –

+0

AESはすでに128ビットのブロックで暗号化しています.gKrypt(http://gkrypt.com/)のようなソリューションでは、すでに膨大な圧縮解除ブーストが行われています。私が使用しているテクスチャは、2kから4k(または今年の8kの終わりまで)のサイズになります。しかし、あなたの懸念のためにthx :)! –

答えて

3

あなたは2つのことをする必要があります。

まず、このデータを生成する操作の同期と可視性を確保する必要があります。 compute shaderを使用してSSBO、バッファテクスチャなどにデータを生成する場合は、glMemoryBarrierGL_PIXEL_BUFFER_BARRIER_BITのセットを使用する必要があります。このデータをレンダリング操作でバッファテクスチャに生成する場合は、明示的なバリアは必要ありません。しかし、FSがSSBOや画像ロード/ストア経由で書いている場合は、前述のように明示的なバリアが必要です。

OpenCLを使用している場合は、OpenCLのOpenGL interop機能を使用して、CL操作の結果をGLに表示させる必要があります。

これが完了したら、asynchronous pixel transfer operationの場合と同じように、バッファをピクセルアンパックバッファとして使用するだけです。圧縮テクスチャは、圧縮されていないテクスチャのようにGL_PIXEL_UNPACK_BUFFERで動作します。

注意:OpenGLでは、すべてのバッファオブジェクトはと同じです。 SSBOとしてバッファを1分使用した場合、OpenGLは気にせず、次にピクセル転送に使用します。あなたがそれを同期している限り、すべてが問題ありません。

+0

すてきな答えですね! –

1

バインドバッファーをGL_PIXEL_UNPACK_BUFFERに設定し、glCompressedTexSubImage2Ddataを呼び出してバッファーにオフセットします。

PBO hereについての詳細を読む。

+0

Thxにリンクしています。私はCGには比較的新しいので、今日のPBOについて読むと、私の研究結果に応じてあなたの答えに印をつけます; –

関連する問題