2017-01-03 36 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

相關問題