-->

glPixelStorei(GL_UNPACK_ALIGNMENT,1)缺点?(glPixelSto

2019-06-25 12:14发布

什么是始终使用的1 alginment的缺点是什么?

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

它将在现代GPU影响性能?

Answer 1:

数据怎能不为1字节对齐?

这极有可能是缺乏什么样的理解, 在像素传输操作的行对准装置 。

您传递给OpenGL的图像数据,预计将分成行。 每行包含width的像素数,其中每个像素是由格式和类型参数所定义的大小。 这样的格式GL_RGB与一种类型的GL_UNSIGNED_BYTE将导致在大小24位的像素。 像素否则预计将包装,所以这些像素16的行会占用48个字节。

每行被预期在特定值,以对准,由所限定GL_PACK/UNPACK_ALIGNMENT 。 这意味着,您添加到指针值才能到下一行: align(pixel_size * width, GL_*_ALIGNMENT) 。 如果像素尺寸是3个字节,宽度为2,并且所述对准是1时,行字节大小是6.如果对准为4,行字节大小为八个

看到这个问题?

图像数据,这些数据可以来自某些图象文件格式作为装载有一些图像加载器,具有一排对齐。 有时候,这是对齐的1字节,有时事实并非如此 。 DDS图像具有指定为格式的一部分的取向。 在许多情况下,图像具有4个字节的行比对; 因此像素尺寸小于32位将具有填充在与某些宽度的行的端部。 如果你给对齐OpenGL的不匹配,那么你得到一个畸形的质感。

您可以设置对齐,以匹配图像格式的对齐。 如果你知道或以其他方式可以确保您的行对齐始终为1(这是不可能,除非你写你自己的图像格式或DDS作家),你需要设置的行对齐是什么图像格式使用。



Answer 2:

它将在现代GPU影响性能?

没有,因为像素存储设置只对数据从或到GPU,您的数据即对齐转移培训相关。 一旦在GPU内存它以任何方式排列真实的GPU和驱动程序的愿望。



Answer 3:

将有对性能没有影响。 设置(在OpenGL中)更高的对准没有改善任何东西,或加速任何东西。

所有对齐功能是告诉OpenGL的情况下,以期望像素的下一行。 你应该总是使用对齐1,如果你的图像像素紧凑,即是否存在一些字节结束的行,其中一个新的行开始之间没有间隙。

默认的对齐是4(即openGL的期望的像素的下一行是在存储器中的跳跃是被4整除后),这可能导致在情况下,加载R,RG或RGB纹理其不是4字节浮子问题或者如果你的图像的像素排列紧密,你必须为了改变排列为1拆包工作宽度不被4整除。

你可以(我个人还没有遇到他们)有,比如说,3x3的RGB UBYTE,其行是第四调整地作为最终衬料3个额外的字节的图像。 这行可能是这样的:

的R - G ^ - B - R的 - G - 乙 - R的 - G - 乙 - X - X - X(总共16个字节)

其理由是,调整后的数据提高了处理器的性能(不知道它有多少是真的/有道理的今天的处理器)。 如果你已经在原始图像是如何构成任何控制,那么也许它对准这样或那样会提高它的处理。 但这样做之前,openGL的 。 OpenGL的没有改变这事的方式,只在乎在哪里可以找到的像素。

所以,回到上面的3×3的图像行 - 对齐方式设置为4将是很好的(和必要的)跳过去填充。 如果你把它设置为1,那么,它会乱你的结果,所以你必须保持/使其恢复到4(请注意,您还可以使用ROW_LENGTH跳过去,因为这是用的子集打交道时使用的参数图像,在这种情况下,你有时必须跳更然后3或7个字节(它是8的取向参数可以给你最大值)。在我们的例子,如果你提供的4行长度和1也将对准工作)。

这同样适用于包装。 你可以告诉OpenGL像素行对齐到1,2,4和8。如果您要保存一个3x3 RGB UBYTE,你应该对齐设置为1。从技术上讲,如果你想生成的行包装得紧密,你要经常给1.如果你想(无论何种原因)来创建一些填充,你可以给另一个值。 给予(在我们的例子)的4 PACK_ALIGNMENT,会导致创建看起来像以上(含到底3微胖)行的行。 请注意,在这种情况下,您的包含对象(OpenCV的垫子,位图等)应该能够收到微胖。



文章来源: glPixelStorei(GL_UNPACK_ALIGNMENT, 1) Disadvantages?