我目前正在使用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();
结合过剩的代码..
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();
这非常简单,并且实际代码的大大简化。创建RGB值为#00AA00的帧并使用glDrawPixels绘制。 正如所料,输出是一个绿色窗口。乍一看似乎都很好。
但是当我使用诸如http://instant-eyedropper.com/之类的工具来知道像素的确切RGB值时,我意识到并非所有像素都显示为#00AA00。 某些像素的值为#00A900。左上角的第一个像素,以及同一条线上的第3个,第5个等等,以及每个不均匀的线都是这种情况。
现在它不会出现Instant Eyedropper或Windows的问题,因为其他程序会为同一个文件输出正确的颜色。
现在我的问题: 有可能glDrawPixels以某种方式改变了像素值,可能是为了更快? 我希望这样的函数能准确显示我们输入的内容,所以我不太清楚要考虑什么。
答案 0 :(得分:1)
默认情况下,OpenGL启用了颜色抖动。所以你的GPU实际上可能出于某种原因执行颜色抖动。尝试使用glDisable(GL_DITHER);
禁用它。还要注意色彩管理问题。