编辑:只是让你知道:我还没有完美地解决这个问题,目前我正在使用 0.5px 偏移,它似乎工作,但正如其他人所说,这不是“正确”的解决方案。所以我正在寻找真正的交易,钻石退出规则解决方案根本不起作用。
我相信这可能是显卡中的一个错误,但如果是这样,那么任何专业程序员都应该有他们的防弹解决方案,对吧?
编辑:我现在买了一张新的 nvidia 卡(以前有 ATI 卡),我仍然遇到这个问题。我在很多很多游戏中也看到了同样的错误。所以我想不可能以干净的方式修复?
这是错误的图像:
你如何克服这个问题?如果可能,最好使用非着色器解决方案。当我自己绘制 4 条单独的线而不是使用线框模式时,我尝试为第一条线设置偏移量,但效果不佳:如果矩形大小发生变化,它有时看起来是完美的矩形,但有时甚至比我修复之前更糟.
这就是我渲染四边形的方式:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_QUADS);
glVertex2f(...);
glVertex2f(...);
glVertex2f(...);
glVertex2f(...);
glEnd();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
是的,我知道我可以使用顶点数组或 VBO,但这不是重点。
我也试过GL_LINE_LOOP
了,但它并没有修复错误。
编辑:一种解决方案,到目前为止有效: Lie Ryan 的Opengl 像素完美 2D 绘图:
请注意,OpenGL 坐标空间没有整数的概念,一切都是浮点数,OpenGL 像素的“中心”实际上是在 0.5,0.5 而不是左上角。因此,如果你想要一条从 0,0 到 10,10 的 1px 宽的线,你真的必须画一条从 0.5,0.5 到 10.5,10.5 的线。
如果您打开抗锯齿,这一点尤其明显,如果您有抗锯齿并且您尝试从 50,0 到 50,100 绘制,您可能会看到一条模糊的 2px 宽线,因为该线位于两个像素之间。