ほとんどの画像ライブラリは、画像を幅、高さ、ピッチ、および配列ピクセルとして提供します。ただし、OpenGL はピッチを直接受け取るのではなく、次のことを期待します。
glPixelStorei(GL_UNPACK_ALIGNMENT, align);
glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length);
row_length
ですがpitch / bytes_per_pixel
、 の適切な値をどのように計算しますalign
か?
ほとんどの画像ライブラリは、画像を幅、高さ、ピッチ、および配列ピクセルとして提供します。ただし、OpenGL はピッチを直接受け取るのではなく、次のことを期待します。
glPixelStorei(GL_UNPACK_ALIGNMENT, align);
glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length);
row_length
ですがpitch / bytes_per_pixel
、 の適切な値をどのように計算しますalign
か?
表示される大部分の画像では、 は必要ありませんGL_ROW_LENGTH
。これをゼロ以外の値に設定すると、アップロードのパフォーマンスが大幅に低下する可能性があります。絶対に必要な場合にのみ使用してください。
ほとんどの画像では、ピッチは単純に ( width
* bpp
) で、何らかの境界に揃えられます。たとえば、bpp
が 3 (ピクセルあたりのバイト数) で、幅が 9 の場合、27 になります。これは多くのコンピューターにとって適切な行数ではないため、多くの場合、最も近い 4 の倍数に合わせます。したがって、ほとんどの画像で見られるピッチは 28 です。
したがって、アライメントを計算するには、ピッチを分割する最大の 2 の累乗 (最大 8) を計算するだけです。画像のピッチが 28 の場合、最大の 2 の累乗は 4 です。これを に設定しGL_UNPACK_ALIGNMENT
ます。一般に、ほとんどの画像で使用される最大の配置であるため、4 で停止できます。
使用する必要GL_ROW_LENGTH
があるのは、計算されたピッチ ( align(width * bpp, alignment)
) が実際のピッチと等しくない場合です。その場合は、配置と行の長さの両方を使用する必要があります。しかし、これは非常にまれな出来事であるため、非常に不正確なピッチを使用する画像は破棄する必要があります。
GL_UNPACK_ALIGNMENT
行の最初のピクセルがイメージ内で始まる位置のバイト オフセットです。ほとんどの場合、1 に設定するのが安全な方法です (つまり、ほぼすべての画像タイプで機能します [そして、私にとっては機能しないことはありません])。
デフォルト値は 4 で、RGBA 画像では問題なく機能しますが、RGB 画像ではうまく機能しません (画像を見ればすぐにわかります - 一連の対角線のバンドのように見えます)。