大多数图像库将图像提供为宽度、高度、间距,然后是数组像素。然而,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
is the byte-offset of where the first pixel in a row starts in an image. Setting it to one is almost always the safe bet (i.e., it works with almost every image type [and it's never not worked for me]).
The default value is four, which works fine for RGBA images, but fails miserably for RGB images (you'll know instantly when you see the image - it'll look like a set of diagonal bands).