2012-02-01 8 views
0

私はGLUTでスクリーンキャプチャをしようとしていますが、少し問題があります。 glReadPixels()はCのGLUTスクリーンキャプチャ

Access violoation writing location 0x00000000 

奇妙であるプロジェクトのルートに作成されたファイルであり、かつ、明らかに空である事を私のプログラムをクラッシュさせるようです。いくつかのprintfコマンドをすばやく設定しました。glReadPixels()メソッドの実行中にコードがクラッシュするようです。

私はこの問題を多分変数 'pixels'と感じています。 RGB値が書き込まれるようにこれを定義する正しい方法を見つけ出すことができませんでした。

ヒントをいただければ幸いです。

void savePPM(char ppmFileName[]){ 
    int width = glutGet(GLUT_WINDOW_WIDTH); 
    int height = glutGet(GLUT_WINDOW_HEIGHT); 
    char *pixels = NULL; 

    glReadPixels(0,0, width, height, GL_RGB, GL_UNSIGNED_BYTE ,pixels); 

    ppmFile = fopen(ppmFileName, "wb"); 

    fprintf(ppmFile, "P6\n"); 
    fprintf(ppmFile, "%d %d\n", width, height); 
    fprintf(ppmFile, "255\n"); 
    fwrite(pixels, 1, width*height*3, ppmFile); 

    fclose(ppmFile); 
    free(pixels); 
} 

答えて

3

glReadPixelsそれは単にあなたが最後のパラメータにそれを与えるバッファ内のピクセルデータを格納し、あなたのためのメモリを割り当てません。 NULLポインタを与えているので、アドレス0にデータを格納しようとしていますが、アクセス違反が発生しています。

メモリを最初に割り当て、glReadPixelsに渡して割り当てを解除する必要があります。また、ピクセルデータがパックされずに返されるようにするには、glPixelStoreiに電話する必要があります(代わりに、各スキャンラインを個別に書き込むこともできますが、少しの労力が必要です)。例えば

// Error checking omitted for expository purposes 
char *pixels = malloc(width * height * 3); // Assuming GL_RGB 
glPixelStorei(GL_PACK_ALIGNMENT, 1); 
glReadPixels(..., pixels); 
... 
fwrite(pixels, ...); 
... 
free(pixels); 
+0

malloc' 'の呼び出しに '3'との乗算は、ピクセルフォーマットに依存します。 「3」は24ビットピクセル用です。また、 'malloc'を使う代わりに' GLubyte pixels [PIXELSIZE]; '(' PIXELSIZE'はピクセルあたりのバイト数です)のような配列を宣言してください。 –

+0

この場合、 'glPixelStorei(GL_PACK_ALIGNMENT、1);'の設定に注意する必要があります。OpenGLのデフォルトは各行が4の倍数に整列しているとみなすことです。 – rotoglup

+0

@Joachim:はい、3倍はピクセルに依存します我々は明示的に 'GL_RGB'と' GL_UNSIGNED_BYTE'で24ビットを求めています。 'GLubyteピクセル[PIXELSIZE]'を宣言すると、イメージ全体ではなく、1ピクセルに十分なメモリしか割り当てられないので、 'malloc'(またはその親戚の1つ)で配列を動的に割り当てるか、それは十分に大きいです。 –

関連する問題