2017-01-03 12 views
0

Ich habe verschiedene Informationen in Texturen/Bilder gespeichert. Ich möchte sie auf eine FBO-Textur rendern und dann mit glReadPixels auslesen. Das ganze Bild ist in verschiedene Bereiche aufgeteilt, ich habe 4 Zeilen und 4 Spalten mit Informationen in diesem Bild und ich möchte sie auf verschiedenen Zeigern speichern.verliere dies nach glReadPixels Anruf

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

} 

Die Ausgabe auf der Konsole ist nur vorübergehend für das Debuggen.

Diese Funktionen sind in einer Klasse A. Jetzt bei der zweiten Iteration (i = 1, posX = 16, posY = 0) nach dem Aufruf von glReadPixels verliere ich das "dies" die Debugging-Konsole (ich nicht kenne den Namen, links unten in Xcode) sagt dazu, also die Klasse A NULL. Und danach wirft die for-Schleife eine Ausnahmefehlerzugriffsfehler.

Was passiert dort?

Antwort

3
glReadPixels(posX, posY, posX + _resolution, posY + _resolution, GL_RGB, GL_FLOAT, pixels); 

glReadPixel die zweite und dritte Argument sind Breite und Höhe, nicht die obere rechte Ecke Koordinate (als Code zu übernehmen scheint). Die Konsequenz daraus ist, dass Sie einen Puffer zuweisen, der zu klein für die Datenmenge ist, die von glReadPixel zurückgegeben wird, was zu einem Pufferüberlauf führt.

davon aus, dass die Argumente für glReadPixels korrekt sind, sollten Sie einen größeren Puffer werden Zuweisung:

float pixels[(posX+_resolution)*(posy+_resolution)*3]; 

oder stattdessen den Anruf selbst korrigieren glReadPixels:

glReadPixels(posX, posY, _resolution, _resolution, GL_RGB, GL_FLOAT, pixels); 
+0

Ja, hatte ich im Sinn es war die obere rechte Ecke ^^ das macht Sinn. Vielen Dank – Dominick

Verwandte Themen