gpt4 book ai didi

ios - glTexImage2D 读取超出缓冲区范围(iOS)

转载 作者:行者123 更新时间:2023-12-01 22:29:36 37 4
gpt4 key购买 nike

在下面的简单代码中,我将 1 channel 数据加载到纹理中。我用 glTexImage2D()GL_LUMINANCE (这是一种 1 channel 格式)和 GL_UNSIGNED_BYTE ,所以每个像素应该占用一个字节。我分配了一个大小等于像素数 (2 x 2) 的缓冲区,它表示输入像素数据(像素的值对我们的目的无关紧要)。

当您在启用 Address Sanitizer 的情况下运行以下代码时,它会在对 glTexImage2D() 的调用中检测到堆缓冲区溢出。 ,说它试图读取超出堆分配缓冲区的范围:

#import <OpenGLES/ES2/gl.h>

//...

EAGLContext* context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:context];

GLsizei width = 2, height = 2;
void *data = malloc(width * height); // contents don't matter for now
glTexImage2D(GL_TEXTURE_2D,
0,
GL_LUMINANCE,
width,
height,
0,
GL_LUMINANCE,
GL_UNSIGNED_BYTE,
data);

这是 100% 可重现的,并且发生在 iOS 模拟器和设备上。仅当您将缓冲区的大小增加到 6 时,它才不会溢出(2 比预期的大小 4 大)。

1x1 和 4x4 的尺寸似乎没有这个问题,但 2x2 和 3x3 有。这似乎有点随意。

怎么了?

最佳答案

感谢@genpfault 的评论,我已经解决了。

我需要将解包对齐设置为 1:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

具体来说,解包对齐确定每行开头的对齐方式。默认值为 4。由于我的行没有任何特殊对齐,并且行字节之间没有间隙,因此对齐应该是 1。

第一行将始终对齐,因为 malloc分配 16 个对齐的缓冲区。但是第二行和后续行与默认对齐方式 4 未对齐,除非行长度是 4 的倍数(这解释了为什么 2x2 和 3x3 不起作用,但 4x4 起作用)。 1x1 恰好可以工作,因为它没有第二行。

关于ios - glTexImage2D 读取超出缓冲区范围(iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37664944/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com