1. ホーム
  2. c++

[解決済み] glPixelStorei(GL_UNPACK_ALIGNMENT, 1) デメリット?

2022-02-25 12:35:04

質問

常に1のアルギン酸を使用することのデメリットは何ですか?

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

最近のGPUの性能に影響はありますか?

解決方法は?

<ブロッククオート

どうしてデータが1バイトにならないのですか?

の意味を理解していないことが強く示唆されます。 画素転送操作における行揃えとは .

OpenGLに渡す画像データは、行単位にまとめられていることが想定されています。各行には width ピクセル数で、各ピクセルはformatとtypeパラメータで定義された大きさです。つまり、format が GL_RGB で、タイプは GL_UNSIGNED_BYTE の場合、ピクセルのサイズは24ビットになります。ピクセルはパックされていることが前提なので、このピクセルを16個並べると48バイトになります。

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

問題点が見えてきましたか?

画像データは、何らかの画像ファイルフォーマットから、何らかの画像ローダーで読み込まれたもので、行のアライメントを持っています。これは、1バイト整列の場合もあれば、2バイト整列の場合もあります。 そうでない場合 . DDS画像は、フォーマットの一部としてアライメントが指定されています。多くの場合、画像は 4 バイトの行揃えになっており、32 ビット未満のピクセルサイズでは、特定の幅を持つ行の最後にパディングがあります。OpenGLに与えるアライメントがそれに一致しない場合、不正なテクスチャが生成されます。

画像フォーマットのアライメントに合わせて設定するのです。行のアライメントが常に1であることを知っているか、あるいはそれを保証できる場合(独自の画像フォーマットやDDSライターを書いていない限り、それはありえない)、その画像フォーマットが使用するものと正確に一致するように行のアライメントを設定する必要があるのです。