2

私は、pdf から任意の数の jpeg をロードし、カーネル内のレンダリングされたページに画像を書き出す必要がある特殊なレンダリング アプリを持っています。これは単純化しすぎていますが、ポイントは、'n' 個の画像をテクスチャとしてまとめて送信し、カーネル内で tex2d() 呼び出しのためにこのテクスチャの集合にインデックスを付ける方法を見つけたいということです。これを優雅に行うためのアイデアは大歓迎です。

余談ですが、カーネルで jpeg 画像をデコードする方法をまだ見つけていないため、CPU でデコードしてから (ゆっくりと) 大きなビットマップを送信する必要があります。これを改善できますか?

4

1 に答える 1

1

まず、テクスチャアップロードのパフォーマンスがボトルネックでない場合は、一括アップロードしないことを検討してください。ここにいくつかの提案があり、それぞれに異なるトレードオフがあります。

  1. さまざまなサイズのテクスチャについては、テクスチャアトラスを作成することを検討してください。これは、ゲーム開発で人気のある手法であり、多くのテクスチャを1つの2D画像にパックします。これには、問題の画像の隅にテクスチャ座標をオフセットする必要があり、テクスチャ座標のクランプとラッピングを使用できなくなります。したがって、IDの代わりに、各サブテクスチャのコーナーのオフセットを保存する必要があります。テクスチャアトラスを作成するために利用できるさまざまなツールがあります。

  2. 一定サイズのテクスチャの場合、またはさまざまなサイズのテクスチャの無駄を気にしない場合は、レイヤードテクスチャの使用を検討できます。これは、個別のレイヤーインデックスを使用して、テクスチャフェッチ時にインデックスを作成できる多数の独立したレイヤーを持つテクスチャです。上記のリンクからの引用:

    1次元または2次元のレイヤードテクスチャ(Direct3Dではテクスチャアレイ、OpenGLではアレイテクスチャとも呼ばれます)は、一連のレイヤーで構成されるテクスチャであり、すべて同じ次元、サイズ、およびデータタイプの通常のテクスチャです。 。

    1次元のレイヤードテクスチャは、整数インデックスと浮動小数点テクスチャ座標を使用してアドレス指定されます。インデックスはシーケンス内のレイヤーを示し、座標はそのレイヤー内のテクセルをアドレス指定します。2次元のレイヤードテクスチャは、整数インデックスと2つの浮動小数点テクスチャ座標を使用してアドレス指定されます。インデックスはシーケンス内のレイヤーを示し、座標はそのレイヤー内のテクセルをアドレス指定します。

    レイヤードテクスチャは、cudaArrayLayeredフラグ(および1次元レイヤードテクスチャの場合は高さ0)を指定してcudaMalloc3DArray()を呼び出すことによってのみCUDA配列にすることができます。

    レイヤードテクスチャは、tex1Dlayered()およびtex2Dlayered()で説明されているデバイス関数を使用してフェッチされます。テクスチャフィルタリング(テクスチャフェッチを参照)は、レイヤー間ではなく、レイヤー内でのみ実行されます。

    レイヤードテクスチャは、コンピューティング機能2.0以降のデバイスでのみサポートされます。

  3. ハイブリッドアプローチを検討することができます。テクスチャを同じサイズのグループに分類し、グループごとにレイヤー化されたテクスチャを使用します。または、レイヤードテクスチャアトラスを使用します。このアトラスでは、無駄を最小限に抑えるために、各レイヤーに各グループの1つまたはいくつかのテクスチャが含まれるようにグループがパックされます。

あなたの副次的な質問について:「cudajpegdecode」をグーグル検索すると、少なくとも1つのオープンソースプロジェクトを含む多くの結果が表示されます。

于 2012-10-23T22:35:50.763 に答える