使用OpenGL进行像素完美的2D渲染

时间:2013-01-30 16:05:32

标签: c opengl

是否可以设置OpenGL场景以实现像素完美渲染和像素blitting?我注意到通过以下方式设置场景:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, width, height, 0.0, 0.0, 1.0);

然后使用以下方法绘制像素:

glBegin(GL_POINTS);
glVertex2i(0, 0);
glEnd();

是否始终在每个硬件配置的左上角像素上绘制它(有时它是左边的一个像素,或左上角的一个像素)。我意识到这可能是由于图形驱动程序对OpenGL的不同实现,但是有没有办法让左上角的像素为(0,0),右下角为(width-1,height-1) )始终如一?这似乎很奇怪,这是不标准化的......

我见过一些使用(0.375,0.375)或(0.5,0.5)翻译的“黑客”,但这似乎也解决了某些配置而不是其他配置。

2 个答案:

答案 0 :(得分:6)

编辑:dang,这是一个翻译。更新。

您还必须考虑像素的大小。这就是“翻译黑客”所得到的。如果最左边的像素应该具有中心坐标0.0,那么它的左边界位于-0.5 - 这就是裁剪平面所在的位置。类似地,如果最右边的像素应该具有中心坐标width - 1,那么它的右边界位于(width - 1) + 0.5 - 这就是剪裁平面所在的位置。

所以试试:

glOrtho(-0.5, (width - 1) + 0.5, (height - 1) + 0.5, -0.5, 0.0, 1.0);

这就是翻译的来源。

答案 1 :(得分:1)

首次检查似乎应该有效,如果实现偏移像素,我怀疑它们可能超出规范。然而,它也可能是由于视图颠倒过来,并且一些不准确性蔓延并导致舍入问题。我不相信这种情况,但如果我想做像素完美的渲染,我就不会从引入不必要的变换开始。

我很可能完全避免固定功能管道,只是确保我使用自己的变换计算顶点着色器中的右坐标。这是我的第一个建议 - 现代可编程管道使您能够更好地控制正在发生的事情。

如果做不到这一点,至少尝试以正确的方式渲染事物,看看是否会使你所针对的各种平台更加一致。

或者,我认为这有点像黑客,但有时这些东西是必要的 - 你可以检查它,并相应地使用变换偏移你的坐标(即绘制一个像素并读回来看看它是否结束了在正确的地方,如果不是,它去了哪里)。当然,你可能只是在解决这个问题。

我不会在这里对子像素偏移进行太多调整,更有可能你会引入更多像素不再按照你想要的方式1:1映射的情况。