常に1のalginmentを使用することの欠点は何ですか?
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glPixelStorei(GL_PACK_ALIGNMENT, 1)
最新の gpu のパフォーマンスに影響しますか?
最新の gpu のパフォーマンスに影響しますか?
いいえ、ピクセル ストアの設定は、GPU との間のデータ転送、つまりデータの配置にのみ関連するためです。GPU メモリに配置されると、GPU とドライバーが必要とする方法で整列されます。
パフォーマンスへの影響はありません。(openGLで)より高い位置合わせを設定しても、何も改善されないか、速度が向上します。
すべての配置は、openGL に次の行のピクセルを期待する場所を伝えることです。画像のピクセルがぎっしり詰め込まれている場合、つまり、バイト行の終了位置と新しい行の開始位置の間にギャップがない場合は、常に 1 の配置を使用する必要があります。
デフォルトのアラインメントは 4 です (つまり、openGL は、4 で割り切れるメモリ内のジャンプの後にピクセルの次の行があると想定します)。これは、4 バイトの float ではない R、RG、または RGB テクスチャをロードする場合に問題を引き起こす可能性があります。 、または幅が 4 で割り切れません。画像のピクセルが密集している場合は、展開を機能させるために配置を 1 に変更する必要があります。
あなたは(私は個人的にそれらに遭遇したことはありません)、たとえば3x3 RGB ubyteのイメージを持っている可能性があります。その行は、最終的にパディングとして使用される3つの余分なバイトで4番目に配置されています。どの行が次のようになります。
R - G - B - R - G - B - R - G - B - X - X - X (合計 16 バイト)
その理由は、整列されたデータがプロセッサのパフォーマンスを向上させるためです (今日のプロセッサでどれだけ真実/正当化されているかはわかりません)。元の画像の構成方法を制御できる場合は、何らかの方法で調整すると、処理が改善される可能性があります。しかし、これはopenGL の前に行われます。OpenGL はこれについて何も変更する方法がなく、ピクセルを見つける場所のみを気にします。
上の 3x3 画像の行に戻ります。最後のパディングを飛び越えるには、配置を 4 に設定するのが適切です (そして必要です)。1 に設定すると、結果が台無しになるため、4 に維持/復元する必要があります。この場合、3 バイトまたは 7 バイトをはるかに超えてジャンプする必要がある場合があります (これは、アライメント パラメータ 8 で得られる最大値です)。この例では、行の長さ 4 とアライメント 1 を指定すると、仕事)。
梱包も同様です。ピクセル行を 1、2、4、および 8 に整列するように openGL に指示できます。3x3 RGB ubyte を保存する場合は、整列を 1 に設定する必要があります。技術的には、結果の行を密集させたい場合は、常に 1 を指定する必要があります。(何らかの理由で) パディングを作成したい場合は、別の値を指定できます。(この例では) PACK_ALIGNMENT を 4 にすると、上記の行のような行が作成されます (最後に 3 つの余分なパディングがあります)。その場合、含まれているオブジェクト (openCV マット、ビットマップなど) はその余分なパディングを受け取ることができることに注意してください。