2012-06-14 10 views
25

常に1のアルジネーションを使用することの短所は何ですか?glPixelStorei(GL_UNPACK_ALIGNMENT、1)短所?

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

最新のGPUのパフォーマンスに影響を与えますか?

+0

あなたのデータの中には、1バイトの位置合わせされた行がないかもしれないという事実以外に、あなたは意味しますか? –

+0

POTS以外のテクスチャの場合、アップロード/ダウンロード速度に影響することがあります。 POTSテクスチャの場合は効果がありません。 –

+0

@DietrichEpp:POTSテクスチャとは何ですか? – ronag

答えて

39

どのようにデータを1バイト整列できないのですか?

これは、row alignment in pixel transfer operations meansの理解が不足していることを強く示唆しています。

OpenGLに渡すイメージデータは、行にグループ化されていることが予想されます。各行は、ピクセル数がwidthであり、各ピクセルは、formatおよびtypeパラメータで定義されたサイズです。そのため、タイプがGL_UNSIGNED_BYTEGL_RGBのフォーマットは、24ビットのサイズのピクセルになります。さもなければピクセルはパックされると予想されるので、これらのピクセルのうちの16の行は48バイトを占有する。

GL_PACK/UNPACK_ALIGNMENTで定義されているように、各行は特定の値に整列すると予想されます。つまり、次の行に移動するためにポインタに追加する値はalign(pixel_size * width, GL_*_ALIGNMENT)です。ピクセルサイズが3バイトで、幅が2で、整列が1の場合、行のバイトサイズは6です。整列が4の場合、行のバイトサイズはの8つです。です。

を参照してください。

一部のイメージローダーでロードされたイメージファイル形式のイメージデータは、行の配置があります。場合によっては1バイトで整列され、時にはではありません。 DDSイメージのフォーマットは、フォーマットの一部として指定されています。多くの場合、イメージは4バイト行のアラインメントを持ちます。したがって、32ビット未満のピクセルサイズは、特定の幅を有する行の最後にパディングを有することになる。あなたがOpenGLに与えるアラインメントがそれと一致しない場合、あなたは不正なテクスチャを取得します。

アライメントを画像フォーマットのアライメントに合わせて設定します。行の配置が常に1であることがわかっている場合(または独自のイメージフォーマットまたはDDSライターを作成している場合を除き)、行の配置をイメージフォーマットと同じに設定する必要があります。

+0

それは意味があります、私は行の面で考えていませんでした。ですから、 "行数/行バイト"(これは私がPBOにデータをコピーしなければならないのでできます)を制御できれば、どのような配置が最適でしょうか? 8バイト整列を使用するとパフォーマンスが向上しますか? – ronag

+0

私はGL_RGBデータを持っている場合、それをPB_にコピーする間に自分自身をGL_RGBAに変換すべきですか? – ronag

+2

@ronag:アンパックの性能を上回る可能性は低いですが、これはSIMDを使用して書き込むための非常に複雑な関数です。あなたのアプリケーションがアップロード速度によって制限されていることを示すベンチマークで正当化されなければならない多くの作業のように聞こえる*とアップロード速度はunpackerによって悪影響を受ける*。 –

9

最新のGPUでパフォーマンスに影響を与えますか?

いいえ、ピクセルストアの設定は、GPUとの間でのデータの転送、つまりデータの整列にのみ関連します。一旦GPUメモリ上に置かれると、GPUとドライバが望むどのような方法でも調整されます。

+2

私は、アップロードする前に1つまたは複数のGPUでCPUにデータの変更を要求するかどうかを質問していると思います。つまり、GPUがバイト整列の行を処理できない場合です。 –

+4

私はそれがgpuのアップロード/ダウンロードに影響するかどうか、またいつ他の側面があるかについて考えています。 – ronag

+2

@ronag:GPUが元のデータのデータフォーマットに対応できない場合は、データフォーマットをまずドライバで変換する必要があります。ただし、全体的にテクスチャデータをアップロードすることになるので、CPU時間はごくわずかです。しかし、データ転送は私がGPUのパフォーマンス上の問題と考えるものではありません。ボトルネックは明らかにCPUとデータバスです。 – datenwolf