Java 使用libGDX以小(<;0.5)比例呈现字体时出现问题

Java 使用libGDX以小(<;0.5)比例呈现字体时出现问题,java,kotlin,fonts,libgdx,Java,Kotlin,Fonts,Libgdx,我已经为我的libGDX游戏创建了一个BitmapFont,并希望将其呈现在玩家面前(在空间中的固定位置,即像一个标志,而不是像一个HUD)。可悲的是,渲染在小范围内表现得很奇怪,以至于文本变得不可读。到底发生了什么?有什么办法可以防止这种情况 刻度为0.5F时(正常): 比例为0.2F(??): 比例为0.1F(??): 完整(减去生成/项目文件): 使用鼠标光标四处移动 按ESC退出应用程序 我在截图之间更改的行是font.data.setScale(-0.5F,0.5F) 包xjcl.

我已经为我的libGDX游戏创建了一个
BitmapFont
,并希望将其呈现在玩家面前(在空间中的固定位置,即像一个标志,而不是像一个HUD)。可悲的是,渲染在小范围内表现得很奇怪,以至于文本变得不可读。到底发生了什么?有什么办法可以防止这种情况

刻度为0.5F时(正常):

比例为0.2F(??):

比例为0.1F(??):

完整(减去生成/项目文件):

  • 使用鼠标光标四处移动
  • 按ESC退出应用程序
  • 我在截图之间更改的行是
    font.data.setScale(-0.5F,0.5F)
包xjcl.extracredits2020
导入com.badlogic.gdx*
导入com.badlogic.gdx.graphics*
导入com.badlogic.gdx.graphics.g2d*
导入com.badlogic.gdx.math.Vector3
类RangeAnxietyGame:ApplicationAdapter(){
lateinit var cam:透视照相机
lateinit var spriteBatch:spriteBatch
lateinit变量字体:BitmapFont
覆盖乐趣创建(){
Gdx.input.apply{isCursorCatched=true}
spriteBatch=spriteBatch()
font=BitmapFont()
cam=PerspectiveCamera(67F,Gdx.graphics.width.toFloat(),Gdx.graphics.height.toFloat())。应用{
位置设置(矢量3(0f,1.8f,0f))
注视(0f、1.8f、1f)
更新()
}
}
覆盖乐趣渲染(){
glViewport(0,0,Gdx.graphics.width,Gdx.graphics.height)
Gdx.gl.glClearColor(0f、0f、0f、1f)
Gdx.gl.glClear(GL20.gl\u颜色\u缓冲\u位或GL20.gl\u深度\u缓冲\u位)
如果(Gdx.input.isKeyPressed(input.Keys.F))
Gdx.graphics.setFullscreenMode(Gdx.graphics.displayMode)
如果(Gdx.input.isKeyPressed(input.Keys.G))
Gdx.graphics.setWindowedMode(1280720)
if(Gdx.input.isKeyPressed(input.Keys.ESCAPE))
Gdx.app.exit()
val dt=Gdx.graphics.deltaTime//秒
凸轮。应用{
旋转(Gdx.input.deltaX*-20*dt,0F,1F,0F)
旋转(向上.cpy().crs(方向),Gdx.input.deltaY*10*dt)
Gdx.input.setCursorPosition(Gdx.graphics.width/2,Gdx.graphics.height/2)
更新()
}
spriteBatch.apply{//goal text——糟糕且有问题
开始
projectionMatrix=cam.combined.cpy().translate(0F,0F,50F)
字体数据设置刻度(-0.5F,0.5F)
font.draw(这是“${cam.position.z.toInt()}m/50m\n${Gdx.graphics.width}x${Gdx.graphics.height}”+
“${(1/dt).toInt()}fps\n按比例(-0.5F,0.5F)”,0F,0F)
完()
}
}
}
此外,捕获光标开始工作,但随后中断(如果我使用
F
进入全屏,然后使用
G
退出,光标可以从四面八方逃逸。我还可以全屏逃逸到第二个监视器。
setCursorPosition
没有任何区别。)我应该为此单独发布一个问题吗?

您需要使用

font.setUseIntegerPositions(false)
因此,它不会将每个字符的位置舍入为整数坐标。在3D空间中这样做是没有意义的,它会导致你的字母彼此重叠。(默认情况下,libGDX这样做的原因是,它会使以像素完美比例渲染的二维文本看起来更清晰。)


背景:您的字体似乎使用了
最近的
作为缩小过滤器。最近过滤意味着对于每个屏幕像素,它从纹理中选择最近的坐标,并将其显示为屏幕像素的颜色。当绘制的纹理相对于屏幕像素大小小于其源图像大小,并且您正在使用
最近的
过滤时,您将出现像屏幕截图显示的丑陋瑕疵

如果要在三维空间中绘制文本,最好使用
mipmaplinearest
MipMapLinearLinear
作为缩小过滤器。这将允许OpenGL在源图像像素之间进行插值,使文本看起来清晰
MipMapLinearLinear
在这两种选择中具有更好的外观,但代价是一些GPU。我总是使用
MipMapLinearLinear
,而且从未有过足够的文本覆盖屏幕,以至于对性能的影响会非常显著

要在位图字体文件中修复此问题,请查找以下行:

filter: Nearest,Nearest
并将其更改为

filter: MipMapLinearLinear,Linear
最后一个
Linear
是将放大过滤器设置为插值,这样当您靠近文本时,文本就不会看起来像像素一样


此外,在Heiro或BMFont或任何用于创建字体的应用程序中都应该有相应的设置,因此您不必手动编辑字体文件的文本。

谢谢您的回答<代码>使用积分位置
修复了所有问题!顺便说一句,我使用的是“默认”字体,我没有字体文件。哦,对了。过滤问题实际上只会在它缩小到可能无法辨认的地方时才成为问题。不过,您可能需要考虑切换过滤,以使文本看起来不那么别名。但我认为,修改默认字体的过滤以使用mip映射有点复杂。