2

大多数图像库将图像提供为宽度、高度、间距,然后是数组像素。然而,OpenGL 并不直接接受音调,而是期望:

 glPixelStorei(GL_UNPACK_ALIGNMENT, align);
 glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length);

row_lengthpitch / bytes_per_pixel,但是如何计算正确的值align呢?

4

2 回答 2

1

对于您将看到的绝大多数图像,您不需要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)) 不等于实际音高的时候。如果发生这种情况,那么您需要同时使用对齐方式和行长。但这种情况非常罕见,您可能应该丢弃任何使用如此严重错误音调的图像。

于 2013-02-24T23:12:10.510 回答
-1

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).

于 2013-02-24T14:17:44.340 回答