首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glPixelStorei(GL_UNPACK_ALIGNMENT,1)的缺点?

glPixelStorei(GL_UNPACK_ALIGNMENT,1)的缺点?
EN

Stack Overflow用户
提问于 2012-06-15 06:07:47
回答 3查看 19.6K关注 0票数 31

总是使用% 1的海藻有什么缺点?

代码语言:javascript
复制
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glPixelStorei(GL_PACK_ALIGNMENT, 1)

它会影响现代gpus的性能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-15 13:52:08

数据怎么可能不是1字节对齐的?

这强烈地表明了对row alignment in pixel transfer operations means的缺乏理解。

您传递给OpenGL的图像数据应该分组成行。每行包含width个像素,每个像素的大小由格式和类型参数定义。因此,具有GL_UNSIGNED_BYTE类型的GL_RGB格式将产生24位大小的像素。否则预计会打包像素,因此这些像素中的16行将占用48个字节。

按照GL_PACK/UNPACK_ALIGNMENT的定义,每一行都应与特定值对齐。这意味着您添加到指针以转到下一行的值是:align(pixel_size * width, GL_*_ALIGNMENT)。如果像素大小为3字节,宽度为2,对齐为1,则行字节大小为6。如果对齐为4,则行字节大小为8

看到问题了吗?

图像数据具有行对齐,所述图像数据可能来自由某些图像加载器加载的某些图像文件格式。有时是1字节对齐,有时不是。DDS图像将一个对齐指定为格式的一部分。在许多情况下,图像具有4字节行对齐;因此,小于32位的像素大小将在具有特定宽度的行的末尾具有填充。如果你给OpenGL的对齐方式不匹配,你就会得到一个畸形的纹理。

将对齐方式设置为与图像格式的对齐方式相匹配。如果您知道或以其他方式可以确保行对齐方式始终为1(除非您编写了自己的图像格式或DDS编写器,否则这是不太可能的),则需要将行对齐方式设置为您的图像格式所使用的方式。

票数 46
EN

Stack Overflow用户

发布于 2012-06-15 07:50:31

它会影响现代gpus的性能吗?

不是,因为像素存储设置只与GPU之间的数据传输相关,即数据对齐。一旦在GPU内存中,它就可以以GPU和驱动程序所需的任何方式对齐。

票数 11
EN

Stack Overflow用户

发布于 2019-03-29 04:39:39

这不会对性能产生影响。设置更高的对齐方式(在openGL中)不会改善任何事情,也不会加快任何事情。

所有对齐所做的就是告诉openGL在哪里期望下一行像素。如果图像像素紧密堆积,也就是说,如果在字节行的结束位置和新行的开始位置之间没有间隙,则应始终使用1对齐。

默认对齐方式为4 (即openGL期望下一行像素位于可被4整除的内存跳转之后),这可能会在加载不是4字节浮点数的R、RG或RGB纹理,或者宽度不能被4整除的情况下导致问题。如果图像像素被紧密打包,则必须将对齐方式更改为1,以便解包工作。

你可以(我个人没有遇到过)有一个3x3RGB ubyte的图像,它的行是第四对齐的,最后用3个额外的字节作为填充。哪些行可能如下所示:

R-G-B-X-X-X(共16字节)

原因是对齐的数据提高了处理器的性能(不确定在今天的处理器上这是正确的/合理的)。如果你可以控制原始图像的合成方式,那么也许以某种方式对齐它会改善对它的处理。但这是在openGL之前完成的。OpenGL没有办法改变这一点,它只关心在哪里找到像素。

因此,回到上面的3x3图像行-将对齐设置为4会很好(也是必要的)跳过最后一个填充。如果您将其设置为1,那么它将弄乱您的结果,因此您需要将其保留/恢复为4。(请注意,您也可以使用ROW_LENGTH跳过它,因为这是在处理图像的子集时使用的参数,在这种情况下,您有时必须跳转超过3或7字节(这是对齐参数8所能提供的最大值)。在我们的示例中,如果您提供的行长为4,并且对齐方式为1,则也可以)。

包装也是如此。您可以告诉openGL将像素行对齐为1、2、4和8。如果您要保存3x3 RGB ubyte,则应将对齐设置为1。从技术上讲,如果您希望结果行紧凑在一起,则应始终设置为1。如果您(无论出于何种原因)想要创建一些填充,您可以给出另一个值。如果(在我们的示例中) PACK_ALIGNMENT为4,则会创建与上面的行类似的行(末尾有3个额外的填充)。注意,在这种情况下,您的包含对象(openCV mat、位图等)应该能够接收到额外的填充。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11042027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档