2

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

如您所见,字体有点不可读,但较低的部分(如“测试”)看起来符合预期。似乎屏幕上的位置会影响可读性,因为边缘会被切割。字体是 9x5,我将这个值除以 2 以获得宽度/高度并从中心渲染对象。因此,对于 4.5x2.5 像素(我对简单矩形的 x、y、宽度和高度使用浮点数),如果在 x.5 左右以外的地方渲染纹理就会混乱。但是,它目前仅在两台计算机上执行此操作,但我不希望出现此错误,因为它会使文本不可读。我可以使它成为 4.55x2.55(通过在除以 2 时增加一点额外的大小),然后它在所有机器上都能充分呈现(或者至少在有问题的两台机器上不会经常发生),但我担心这个是一个太粗暴的hack,不能完全解决问题,它可能会放大文本,使字体看起来……“胖”。所以我的问题是......有什么办法可以防止这种情况发生,而不是将这些值交换为整数?(相比之下,我需要浮动提供的细微差别)。我可以找出哪些宽度/高度可以被 2 整除,而那些不能被 2 整除的则以不同的方式处理它们?如果确实是显卡问题,是否有可能绕过它?对不起,如果这个问题有什么不足之处,我不会经常求助于互联网,我也没有编码研究。我很乐意提供任何可能需要的代码行或代码块。并且不将这些值交换为整数?(相比之下,我需要浮动提供的细微差别)。我可以找出哪些宽度/高度可以被 2 整除,而那些不能被 2 整除的则以不同的方式处理它们?如果确实是显卡问题,是否有可能绕过它?对不起,如果这个问题有什么不足之处,我不会经常求助于互联网,我也没有编码研究。我很乐意提供任何可能需要的代码行或代码块。并且不将这些值交换为整数?(相比之下,我需要浮动提供的细微差别)。我可以找出哪些宽度/高度可以被 2 整除,而那些不能被 2 整除的则以不同的方式处理它们?如果确实是显卡问题,是否有可能绕过它?对不起,如果这个问题有什么不足之处,我不会经常求助于互联网,我也没有编码研究。我很乐意提供任何可能需要的代码行或代码块。

4

3 回答 3

0

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

于 2009-08-23T20:47:52.140 回答
0

由于不同的分辨率、纹理过滤等,在 OpenGL 中尝试做这样的像素完美的事情可能会很困难。

你可以尝试一些事情:

  • 将您的字体绘制成一个大纹理(例如 512x512)。
  • 使用 Alpha 通道(透明度)绘制比您需要的更大的字形并消除锯齿。
  • 在每个字形周围留一些空白空间(4 或 8 像素)。如果你让它们相互推挤(就像你在 DOS 时代为软件渲染绘制字体一样),那么过滤将使它们相互渗透。
  • 或者你可以采取不同的方法,使它们脱离线段。这对于您正在处理的比例上的字体可能会更好。
于 2009-08-23T22:45:18.583 回答
0

如果您必须在非整数坐标处绘制文本,则应启用纹理过滤。使用glTexParameterfv设置GL_TEXTURE_MIN_FILTER和. GL_TEXTURE_MAG_FILTER_ GL_LINEAR您的文本会变得模糊,但如果不求助于像素完美(=整数)坐标,就无法避免这种情况。

请注意,您的 0.05 解决方法只会更改有效坐标舍入为整数的方式。使用GL_NEAREST纹理过滤时,没有半像素偏移之类的东西。即使您指定了这些坐标,纹理过滤器也会为您四舍五入。您只需使用额外的 0.05 将其推向正确的方向。

于 2009-08-24T20:13:17.197 回答