我在纹理/图像中存储了不同的信息。我想将它们渲染到FBO纹理上,然后使用glReadPixels读出它们。
整个图像分为不同的区域,我在该图像中有4行4列的信息,我想将它们存储在不同的Pointer中。
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)中,我失去了调试控制台“ this”(我不知道这个名字,为此,请在Xcode的左下角进行说明,因此类A为NULL。
之后,for循环会引发异常错误的访问错误。
那里发生了什么事?
最佳答案
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);
关于c++ - glReadPixels调用后丢失此文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41437262/