我目前正在使用 OpenGL 开发适用于 Windows 的视频播放器。它工作得很好,但我的主要目标之一是准确性。也就是说,显示的图像应该正是保存为视频的图像。
拿走所有与视频/文件/输入相关的东西,我有一些类似的东西作为我的 glutDisplayFunc:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLubyte frame[256*128*4]; // width*height*RGBA_size
for (int i=0;i<256*128;i++)
{
frame[i*4] = 0x00; // R
frame[i*4+1] = 0xAA; // G
frame[i*4+2] = 0x00; // B
frame[i*4+3] = 0x00; // A
}
glRasterPos2i(0,0);
glDrawPixels(256,128,GL_RGBA,GL_UNSIGNED_BYTE,frame);
glutSwapBuffers();
结合 glut 的代码..
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(256, 128);
glutCreateWindow("...");
glutDisplayFunc(Render);
glPixelZoom(1,-1); // use top-to-bottom display
glEnable(GL_DEPTH_TEST);
glutMainLoop();
这非常简单,并且是对实际代码的巨大简化。使用 glDrawPixels 创建和绘制具有 RGB 值 #00AA00 的帧。正如预期的那样,输出是一个绿色窗口。乍一看,一切似乎都很好。
但是当我使用http://instant-eyedropper.com/之类的工具来了解像素的确切 RGB 值时,我意识到并非所有像素都显示为 #00AA00。一些像素的值为#00A900。它将是左上角的第一个像素,以及同一行上的第 3 个、第 5 个等,以及每条不均匀的行。
现在它不会成为 Instant Eyedropper 或 Windows 的问题,因为其他程序会为同一文件输出正确的颜色。
现在我的问题是:glDrawPixels 是否有可能以某种方式改变像素值,也许是一种更快的方式?我希望这样的函数能够准确地显示我们在其中输入的内容,所以我不太确定该怎么想。