2012-02-01 169 views
0

我想在GLUT中執行屏幕捕獲,我遇到了一些問題。 glReadPixels()似乎崩潰我的程序與GLUT屏幕捕獲在C

Access violoation writing location 0x00000000 

這是奇怪的是項目的根目錄中創建的文件,顯然是空的東西。我快速設置了一些printf命令,看起來代碼在glReadPixels()方法中每次崩潰。

我覺得這個問題可能是變量'像素'。我很難找出正確的方法來定義這個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

與'3'在通話中的乘法'malloc'取決於像素格式。 '3'是24位像素。另外,爲了不使用'malloc',爲什麼不聲明像GLubyte pixels [PIXELSIZE];(其中'PIXELSIZE'是每個像素的字節數)的數組。 – 2012-02-01 07:10:37

+0

在這種情況下,你必須小心設置'glPixelStorei(GL_PACK_ALIGNMENT,1);',OpenGL默認是考慮每行對齊的倍數爲4. – rotoglup 2012-02-01 08:22:19

+0

@Joachim:是的,乘以3取決於像素格式,但我們在這裏用'GL_RGB'和'GL_UNSIGNED_BYTE'明確要求24位。聲明'GLubyte像素[PIXELSIZE]'只爲一個像素分配足夠的內存,而不是爲整個圖像分配足夠的內存 - 您需要動態分配帶有malloc(或其親屬之一)的數組或者使用大型靜態分配數組並且希望它足夠大。 – 2012-02-02 00:00:51