glDrawPixels输出一些像素,但不是预期的RGB值

时间:2012-06-05 15:41:05

标签: c++ opengl glut

我目前正在使用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以某种方式改变了像素值,可能是为了更快? 我希望这样的函数能准确显示我们输入的内容,所以我不太清楚要考虑什么。

1 个答案:

答案 0 :(得分:1)

默认情况下,OpenGL启用了颜色抖动。所以你的GPU实际上可能出于某种原因执行颜色抖动。尝试使用glDisable(GL_DITHER);禁用它。还要注意色彩管理问题。