【问题标题】:Given the pitch of an image, how to calculate the GL_UNPACK_ALIGNMENT?给定图像的间距,如何计算 GL_UNPACK_ALIGNMENT?
【发布时间】:2013-02-24 14:02:10
【问题描述】:

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

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

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

【问题讨论】:

  • “最多图片库”?我不知道有很多这样的。 FreeImage 可以,但仅此而已。
  • SDL、ClanLib、Gtk、Cairo、libjpeg、libpng 等等,我想我从来没有接触过在 OpenGL 之外不使用宽度/高度/间距/数组/格式的软件。有人称它为striderowbytes 而不是pitch,但仅此而已。

标签: opengl


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

【讨论】:

    【解决方案2】:

    GL_UNPACK_ALIGNMENT 是图像中行中第一个像素开始位置的字节偏移量。将其设置为 1 几乎总是安全的选择(即,它几乎适用于所有图像类型 [而且对我来说从来没有用过])。

    默认值为 4,它适用于 RGBA 图像,但不适用于 RGB 图像(当您看到图像时您会立即知道 - 它看起来像一组对角线带)。

    【讨论】:

    • 我知道 1 在大多数情况下都可以,但我对如何正确执行它很感兴趣,即使图像库返回了一些不寻常的音高值。
    • 它实际上是像素的单个组件中的字节数。因此,例如,如果您有一个 GL_RGB 像素矩形的 unsigned short 组件,您可以将 GL_UNPACK_ALIGNMENT 设置为 2 (sizeof(GLushort))。
    • -1:不,将其设置为 1 并不“几乎总是”正确。如果图像格式使用 4 字节的行对齐(有些确实如此),并且您尝试存储具有奇数宽度的 RGB 图像,那么您将搞砸填充。此外,它不是“图像中行中第一个像素开始位置的字节偏移量”;它是每一行像素的字节alignment。也就是说,将在该对齐方式中填充一行。
    • 确实,与“字节偏移”相比,我应该说“对齐”。你的观点是正确的,所以我接受你的观点。也就是说,根据我帮助人们的经验,将 unpack 对齐设置为 1 所纠正的错误比它产生的错误要多得多。
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多