glTexImage2D读出界限

two*_*two 1 opengl textures

我试图用glTexImage2D将数据读入纹理.似乎无论我尝试什么,第一行纹素都被正确读取,但是进一步的行是从内存方式创建的,超出了给定std :: vector的边界:

GLuint renderedTexture;
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);

int w = 8;
int h = 8;
std::vector<GLuint> emptyData(w*h, 0);

emptyData[0] = 0xFF<<8; //blue
emptyData[1] = 0xFF<<16; //green
emptyData[3] = 0xFF<<24; //red
emptyData[w] = 0xFF<<16; // <- should be in second row, but is not shown

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0,GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, emptyData.data());
Run Code Online (Sandbox Code Playgroud)

根据纹理的大小,代码段错误.我已经尝试过使用GLubytes的矢量,但这也不起作用.我也试过了glPixelStorei(GL_UNPACK_ALIGNMENT, 1),但那也没用.我在这里错过了什么?

编辑:进一步的实验表明,以像素读取时假设的最小宽度似乎是128px.因此,如果我创建一个大小为64*64且需要x = 10,y = 14的单个像素的纹理,我必须先写入emptyData[10 + 14*128]并且必须预先保留适当的内存量.有人知道这是否依赖于平台或为什么会这样?

小智 5

阅读您对最小线宽的观察,我GL_UNPACK_ROW_LENGTH想到了像素存储模式(参见OpenGL-Refpage).

它允许您设置行的大小,跳过行填充或行之间的其他数据.但是默认情况下,这应该为零.也许GL_UNPACK_ROW_LENGTH是在代码中的其他地方设置的?