C中的GLUT屏幕截图

时间:2012-02-01 04:40:41

标签: c visual-studio-2010 glut screen-capture

我正在尝试在GLUT中进行屏幕捕获,我遇到了一些问题。 glReadPixels()似乎用

来破坏我的程序
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);
}

1 个答案:

答案 0 :(得分: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);