我正在尝试使用glReadPixels将OpenGL屏幕保存到文件中。我找到了这个代码:
void saveScreenshotToFile(const char* filename, int WIDTH, int HEIGHT) {
int* buffer = new int[WIDTH * HEIGHT * 3];
glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGR, GL_UNSIGNED_BYTE, buffer);
FILE* out = fopen(filename, "w");
short TGAhead[] = { 0, 2, 0, 0, 0, 0, WIDTH, HEIGHT, 24 };
fwrite(&TGAhead, sizeof(TGAhead), 1, out);
fwrite(buffer, 3 * WIDTH * HEIGHT, 1, out);
fclose(out);
}
在那之后,我只是给你打电话
saveScreenshotToFile("file.tga", 800, 600);
1条答案
按热度按时间yzuktlbb1#
这是因为默认情况下,
GL_PACK_ALIGNMENT
参数为4。由于图像具有3个颜色通道(GL_BGR)并且压缩紧密,因此图像的一行大小可能不会对齐到4个字节。如果从GPU读取具有3个颜色通道的RGB图像,并且3*宽度不能被4整除,则在读取具有
glReadPixels
的图像之前,必须将GL_PACK_ALIGNMENT
设置为1:另一个问题可能是,您的屏幕是DPI缩放的,并且帧缓冲区大小与窗口大小不匹配。在截图前确定帧缓冲区大小,例如GLFW:
更多类似C++的函数: