web-dev-qa-db-ja.com

glPixelStorei(GL_UNPACK_ALIGNMENT、1)欠点?

常に1の配置を使用することの欠点は何ですか?

glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glPixelStorei(GL_PACK_ALIGNMENT, 1)

最新のgpusのパフォーマンスに影響しますか?

29
ronag

データを1バイトに整列できないのはなぜですか?

これは、ピクセル転送操作における 行の配置が の意味を理解していないことを強く示唆しています。

OpenGLに渡す画像データは、行にグループ化されることが期待されています。各行にはwidth個のピクセルが含まれ、各ピクセルは、フォーマットおよびタイプパラメーターで定義されたサイズです。そのため、_GL_RGB_の型を持つ_GL_UNSIGNED_BYTE_のフォーマットは、サイズが24ビットのピクセルになります。それ以外の場合、ピクセルはパックされると予想されるため、これらのピクセルの16の行は48バイトを占有します。

各行は、_GL_PACK/UNPACK_ALIGNMENT_で定義されているように、特定の値で整列されることが期待されています。これは、次の行に移動するためにポインターに追加する値がalign(pixel_size * width, GL_*_ALIGNMENT)であることを意味します。ピクセルサイズが3バイト、幅が2、配置が1の場合、行バイトサイズは6です。配置が4の場合、行バイトサイズはeight

問題がわかりましたか?

画像ローダーは、画像ローダーで読み込まれた画像ファイル形式から取得される場合があり、行の配置が調整されます。これは1バイト境界で整列される場合もあれば、整列されない場合もあります。 DDSイメージには、フォーマットの一部として指定された配置があります。多くの場合、画像には4バイトの行揃えがあります。したがって、32ビット未満のピクセルサイズでは、特定の幅の行の最後にパディングが行われます。 OpenGLで指定した配置がそれに一致しない場合、不正なテクスチャが作成されます。

画像形式の配置と一致するように配置を設定します。行の配置が常に1であることを知っているか、そうでなければ保証できる場合(そして、独自の画像形式またはDDSライターを作成していない限り、それは起こりそうにありません)、行の配置を、画像形式が使用するものとまったく同じになるように設定する必要があります。

44
Nicol Bolas

最新のgpusのパフォーマンスに影響しますか?

いいえ、ピクセルストアの設定は、GPUとの間のデータ転送、つまりデータの配置にのみ関連しています。 GPUメモリに入ると、GPUとドライバーが望む方法で配置されます。

11
datenwolf

パフォーマンスへの影響はありません。 (openGLで)より高い配置を設定しても、何も改善されないか、速度が速くなります。

すべての調整は、次のピクセル行を期待する場所をopenGLに指示することです。画像のピクセルが密にパックされている場合、つまりバイトの行が終了する場所と新しい行が開始する場所の間にギャップがない場合は、常に1の配置を使用する必要があります。

デフォルトの配置は4です(つまり、openGLは次のピクセル行が4で割り切れるメモリ内のジャンプの後にあると想定しています)。これは、4バイトの浮動小数点数ではないR、RG、またはRGBテクスチャをロードする場合に問題を引き起こす可能性があります。 、または幅が4で割り切れない場合。画像のピクセルが密にパックされている場合は、アンパックを機能させるために配置を1に変更する必要があります。

あなたは(私がそれらに遭遇したことはありませんが)、たとえば、行が4番目に配置され、最後にパディングとして使用される3バイトが追加された3x3 RGB ubyteの画像を持つことができます。次のような行があります。

R-G-B-R-G-B-R-G-B-X-X-X(合計16バイト)

その理由は、アラインされたデータがプロセッサのパフォーマンスを向上させるためです(今日のプロセッサでどれだけ真実/正当化されているかはわかりません)。 [〜#〜] if [〜#〜]元の画像の構成方法を自由に制御できるため、何らかの方法で画像を調整すると、処理が向上します。しかし、これはopenGLより前で行われます。 OpenGLはこれについて何も変更する方法がなく、ピクセルを見つける場所のみを考慮します。

したがって、上の3x3画像の行に戻ります。配置を4に設定すると、最後のパディングを飛び越すのに適しています(必要です)。これを1に設定すると、結果が乱れるため、4に保持/復元する必要があります(ROW_LENGTHを使用してジャンプすることもできます。これは、画像の場合、3または7バイトをはるかに超えてジャンプする必要がある場合があります(これは、8の配置パラメーターで得られる最大値です)。この例では、行の長さを4に、配置を1にすると、作業)。

梱包も同様です。 openGLにピクセル行を1、2、4、8に配置するように指示できます。3x3RGB ubyteを保存する場合は、配置を1に設定する必要があります。技術的には、結果の行を密にパックする場合は、常に1を与える必要があります。何らかの理由でパディングを作成したい場合は、別の値を指定できます。 (この例では)PACK_ALIGNMENTに4を指定すると、上の行のように見える行が作成されます(最後に3つの追加のパディングがある)。その場合、包含オブジェクト(openCVマット、ビットマップなど)がその追加のパディングを受け取ることができるはずです。

0
David Refaeli