ron*_*nag 28 c++ opengl textures alignment pbo
总是使用1的alginment有什么缺点?
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glPixelStorei(GL_PACK_ALIGNMENT, 1)
Run Code Online (Sandbox Code Playgroud)
它会影响现代gpus的性能吗?
Nic*_*las 44
数据如何不是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,则行字节大小为8.
看到问题?
图像数据可能来自某些图像文件格式,如某些图像加载器所加载的,具有行对齐.有时这是1字节对齐,有时不是.DDS图像具有指定为格式一部分的对齐.在许多情况下,图像具有4字节行对齐; 因此,小于32位的像素大小将在具有特定宽度的行的末尾处具有填充.如果你给OpenGL的对齐方式不匹配,那么你会得到格式错误的纹理.
您将对齐设置为与图像格式的对齐方式匹配.如果您知道或以其他方式可以确保行对齐始终为1(除非您编写自己的图像格式或DDS编写器,否则这种情况不太可能),您需要将行对齐设置为图像格式使用的行对齐方式.
dat*_*olf 11
它会影响现代gpus的性能吗?
不,因为像素存储设置仅与从GPU传输数据或与GPU传输数据相关,即数据的对齐.一旦进入GPU内存,它就会以GPU和驱动程序所需的任何方式对齐.