glDrawPixels()有0.375的翻译

时间:2014-02-02 16:55:23

标签: winapi opengl 2d

在使用0.375翻译时,我注意到glDrawPixels()有一些奇怪的行为。这是我的GL初始化:

width = 640; height = 480;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity( );
glOrtho(0, width, height, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity( );
glTranslatef(0.375, 0.375, 0.0);

现在我想在我的GL窗口的最后30行绘制一个640x30像素的缓冲区。因此,我做了以下几点:

glRasterPos2i(0, 480);
glDrawPixels(640, 30, GL_RGBA, GL_UNSIGNED_BYTE, pixelbuffer);

不幸的是,使用此代码无法绘制任何内容。 glGetError()也返回0.有趣的是,只要删除对glTranslatef(0.375,0.375,0.0)的调用,一切正常!

那么有人可以向我解释为什么这两个轴上的0.375平移会混淆glDrawPixels()?这是否在某种程度上舍入到1.0内部使我对glDrawPixels()的调用突然想要超出上下文的边界,因此它被OpenGL修剪?这是我能想到的唯一解释,但我不明白为什么OpenGL应该将0.375的转换为1.0 ...它应该向下舍入到0.0而不是它?

2 个答案:

答案 0 :(得分:2)

在给定投影矩阵的情况下,点(0,480)实际上跨越了一个剪裁平面。您的子像素移位黑客会将该点推到断点之外,并且会剪切光栅位置。在GL中,只要剪切了初始位置(在这种情况下,它就是),glRasterPos (...)将使所有后续栅格操作无效。

您可以尝试glRasterPos2i (0, 479)。无论如何,考虑到窗户的尺寸,这都是更有意义的。您也可以删除整个游戏并使用glWindowPos2i (...)而不是依赖于投影和模型视图矩阵来将栅格坐标定位在窗口空间中。

答案 1 :(得分:0)

我无法回答你关于为什么glTranslatef阻止glDrawPixels停止工作的问题,但我可以告诉你,这不是选择绘制位置的方法。查看man page for glDrawPixels了解更多信息。它会告诉您有关glRasterPosglWindowPos

的信息