OpenGL:当不能被2整除时扭曲的纹理

时间:2009-08-23 20:34:10

标签: opengl rounding textures

我有一个使用OpenGL进行显示的游戏引擎。 我为它编写了一个小菜单,然后在渲染文本后我注意到了一些奇怪的东西。 http://img43.imageshack.us/i/garbagen.png/

如您所见,字体有些难以理解,但较低的部分(如“测试”)看起来像预期的那样。 看起来屏幕上的位置会影响可读性,因为边缘会被切割。 字体是9x5,这个值除以2以获得宽度/高度并从中心渲染对象。 因此,对于4.5x2.5像素(我使用浮点数来表示简单矩形的x,y,宽度和高度),如果渲染到x.5左右以外的其他地方,则纹理会混乱。但是,它现在只在两台计算机上才这样做,但我不喜欢这个错误,因为它使文本不可读。我可以将它设为4.55x2.55(通过在除以2时添加一些额外的大小),然后它在所有机器中充分渲染(或者至少不会在有问题的两个机器中经常发生),但我担心这个是一个太严重的黑客,以保持它,并没有完全解决问题,它可能会扩大文本使字体看起来......“胖”。 所以我的问题是......有什么方法可以阻止这种情况,而不是将这些值交换为整数? (相比之下,我需要浮动提供的细微差别)。我可以找出哪些宽度/高度可以被2整除,而那些不宽,高度可以处理它们?如果它确实是一个视频卡问题,是否有可能规避它? 对不起,如果有任何问题缺乏,我不会经常质疑互联网,我没有编码研究。我很乐意提供可能需要的任何代码或代码块。

3 个答案:

答案 0 :(得分:0)

为了获得最佳可靠性,我会找到一种消除分数的方法。我对XNA和MDX只有一点经验,所以我不知道是否有充分的理由,但你为什么要去中心而不是去角落?

答案 1 :(得分:0)

由于分辨率,纹理过滤等原因,尝试像Open这样的像素完美的东西在OpenGL中很难。

你可以尝试一些事情:

  • 将您的字体绘制成一个大纹理(比如512x512)。
  • 使用Alpha通道(透明度)绘制大于您需要的字形和消除锯齿。
  • 在每个字形周围留一些空格(4或8像素)。如果你把它们向右推到对方(就像你在DOS时间里为软件渲染绘制字体一样),那么过滤将使它们彼此流血。
  • 或者你可以采取不同的方法,使它们脱离线段。对于您正在处理的音阶上的字体,这可能会更好。

答案 2 :(得分:0)

如果必须以非整数坐标绘制文本,则应启用纹理过滤。使用glTexParameterfvGL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER设置为GL_LINEAR。您的文字将会模糊,但如果不使用像素完美(=整数)坐标,则无法避免。

请注意,您的0.05解决方法只会改变有效坐标舍入为整数的方式。使用GL_NEAREST纹理过滤时,不存在半像素偏移。即使您指定了这些坐标,纹理过滤器也会为您舍入它们。你只需按正确的方向推动它。另外0.05。