2017-01-03 143 views
0

我在纹理/图像中存储了不同的信息。我想把它们渲染到一个FBO纹理上,然后用glReadPixels读出它们。 整个图像被分成不同的区域,我有4行4列的信息在这个图像,我想将它们存储在不同的指针。在glReadPixels调用后丢失了这个

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中。现在在第二次迭代(i = 1,posX = 16,posY = 0)调用glReadPixels后,我失去了“this”调试控制台(我没有知道这个名字,在Xcode中留下底部)对此说,所以类A NULL。 之后,for循环引发异常访问错误。

发生了什么?

回答

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); 
+0

是的,我脑子里想的是是有意义的右上角^^。谢谢 – Dominick

相关问题