我试图用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
是在代码中的其他地方设置的?