C中的GLUT屏幕截图
我正在尝试在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); }
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);