我在纹理/图像中存储了不同的信息。我想将它们渲染到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/

10-13 05:12