2

OpenGL でレンダリングされた GLUT ウィンドウから画像をスクレイピングしたいと考えています。表示コールバックの横に、次のコードを挿入しました。

display() {
        drawTriangle(); //Renders the image
        if(shouldDisplay) {
            shouldDisplay=0;
            bytes = width*height*3; //Color space is RGB
            buffer = (GLubyte *)malloc(bytes); //buffer is global var for now
                glFinish();
            glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);

        }
        glutSwapBuffers();
    }

このコードの実行後、malloc が失敗し始めます。エラー 12 の ENOMEM で失敗します。オペレーティング システムや GLUT について十分な知識がないため、これが発生する理由を理解できません。3 GB のマシンに 17K を割り当てようとしているだけです。Windows XP と Visual Studio C++ 2010 Express を使用しています。ヘルプや提案をいただければ幸いです。

4

3 に答える 3

2

そのコードfree(buffer)は最後に a を欠いているため、再描画のたびに、プロセスがメモリおよび/またはアドレス空間を使い果たすまで、ますます多くのメモリが消費されます (64 ビットのアドレス空間はほとんど使い果たされないため、32 ビット システムでのみ後になります)。妥当な時間内に少量の割り当てを行う)。

于 2011-07-30T17:07:44.193 に答える
1

この中途半端な答えを言い換えさせてください。おそらく free() の欠落と連続した割り当てによって、おそらくglReadPixelsがターゲットバッファを上書きすることによって、ヒープが破棄されていると思います。

ほとんどのフレームバッファは、少なくとも 32 ビット/dword でアラインされています。これは、ここのコメントが示すように、w*h*4 バイトが内部表現と一致するため、うまく機能する可能性があることを示唆しています。

アラインメントを1バイトに設定する(別の回答が言うように)私にも問題ないようです。

于 2011-07-30T16:46:07.750 に答える
1

glPixelStorei(GL_PACK_ALIGNMENT, 1);glReadPixels を呼び出す前に試してください。

于 2011-07-30T16:54:21.993 に答える