我正在尝试使用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());
取决于纹理的大小,代码段会出错。我已经尝试使用GLubytes向量,但这也不起作用。我也尝试过glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
,但这也不起作用。我在这里想念什么?
编辑:进一步的实验表明,以像素为单位读取时假定的最小宽度似乎为128px。因此,如果我创建大小为64 * 64的纹理,并且希望在x = 10,y = 14处有单个像素,则必须写入emptyData[10 + 14*128]
并必须事先保留适当的内存量。有人知道这是否取决于平台还是为什么?
答案 0 :(得分:5)
阅读对最小线宽的观察后,就会想到GL_UNPACK_ROW_LENGTH
像素存储模式(请参见OpenGL-Refpage)。
它允许您设置行的大小,跳过行之间的填充或其他数据。但是默认情况下,它应该为零。也许GL_UNPACK_ROW_LENGTH
设置在代码中的其他位置了?