我在纹理/图像中存储了不同的信息。我想将它们渲染到FBO纹理上,然后用glReadPixels读出它们。 整个图像被分成不同的区域,我在这个图像中有4行和4列信息,我想将它们存储在不同的指针上。
std::vector<float*> data;
for (int i = 0; i < _resolution; ++i) {
int posX = mod((float)i, (float)sqrt(_resolution));
posX *= _resolution;
int posY = ((float)i / _resolution);
posY *= _resolution;
float pixels[_resolution*_resolution*3];
glReadPixels(posX, posY, posX + _resolution, posY + _resolution, GL_RGB, GL_FLOAT, pixels);
for (int j = 0; j < _resolution*_resolution; ++j) {
cout << "(" << pixels[j*3] << ", " << pixels[j*3+1] << ", " << pixels[j*3+2] << ")";
}
cout << endl;
data.push_back(pixels);
}
控制台上的输出只是临时调试。
这个函数在A类中。现在在调用glReadPixels之后的第二次迭代(i = 1,posX = 16,posY = 0)我失去了&#34;这个&#34;调试控制台(我不知道名字,在Xcode的左下角)为此说,所以类A NULL。 之后,for循环抛出异常错误的访问错误。
那里发生了什么?
答案 0 :(得分:3)
glReadPixels(posX, posY, posX + _resolution, posY + _resolution, GL_RGB, GL_FLOAT, pixels);
glReadPixel的第二个和第三个参数是宽度和高度,而不是右上角坐标(如您的代码所示)。这样做的结果是,您为glReadPixel返回的数据量分配的缓冲区太小,导致缓冲区溢出。
假设glReadPixels的参数是正确的,你应该分配一个更大的缓冲区:
float pixels[(posX+_resolution)*(posy+_resolution)*3];
或者更正了对glReadPixels本身的调用:
glReadPixels(posX, posY, _resolution, _resolution, GL_RGB, GL_FLOAT, pixels);