【问题标题】:How to make OpenGL pick the nearest larger mipmap?如何让OpenGL选择最近的较大mipmap?
【发布时间】:2012-02-29 11:31:09
【问题描述】:

我想使用 FreeType 使用 OpenGL 绘制文本并使其更清晰,我为每次 mipmap 迭代从 FreeType 生成字体纹理。除了一件事,一切都很好。当我这样做时:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

OpenGL 根据文本的大小选择最近的 mipmap,但如果可用的大小是 16 和 32,而我想要 22,它会选择 16,这看起来很糟糕。有没有办法设置它,让它总是选择最近的较大的 mipmap?

我知道我可以在渲染文本的同时手动设置 mipmap 级别:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, (int) log2(1/scale));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, (int) log2(1/scale));

但这有效吗?那不是完全不需要使用mipmaps吗?我可以制作不同的纹理并根据大小选择一种。那么有没有更好的方法来实现呢?

【问题讨论】:

  • “我想使用 FreeType 使用 OpenGL 绘制文本并使其更清晰,我为每次 mipmap 迭代从 FreeType 生成字体纹理。”这不是一个好主意。 FreeType 呈现较小文本的方式不是适用于 mipmap 插值的方式。这就是为什么您的 GL_LINEAR_MIPMAP_LINEAR 文本看起来很糟糕的原因; FreeType 的小文本提示使小文本看起来不对。最好只有一组您使用的文本分辨率并使用它们。
  • "这就是为什么您的 GL_LINEAR_MIPMAP_LINEAR 文本看起来很糟糕。"放大的光栅化文本看起来比缩小的类似但更大的光栅化文本更糟糕。我相信这是 OP 的方法看起来很糟糕的最大原因。
  • 关于mipmap相关模糊的好讨论:bgolus.medium.com/…

标签: c++ opengl


【解决方案1】:

您可以使用GL_TEXTURE_LOD_BIAS 向 mipmap 级别添加一个常量,这可以帮助您完成此操作(例如,始终选择下一个更高的 mipmap 级别)。但是,这可能只是 mipmap-nearest 不适合这种情况。如果您总是在屏幕空间中显示您的纹理并且确切地知道字体大小与屏幕上的像素的对应关系,那么 mipmapping 对您来说可能是太多的机器。

【讨论】:

    【解决方案2】:

    您是否尝试过将GL_LINEAR_MIPMAP_LINEAR 用作GL_TEXTURE_MIN_FILTER 参数?它应该在两个最近的 mipmap 之间混合。这可能会改善外观。

    另外,您可以尝试使用此处记录的 texture_lod_bias 扩展名: http://www.opengl.org/registry/specs/EXT/texture_lod_bias.txt

    【讨论】:

    • 是的,我从 GL_LINEAR_MIPMAP_LINEAR 开始,但情况更糟(有“幽灵”,因为不同大小的字母对齐不那么好)。
    • 当我编写一个 OpenGL 位图字体实用程序时,我只是坚持使用固定大小的输出,例如16x24。因为我每次都在一致缩放的正交投影(基本上宽度/高度等于视口大小)中绘制文本,所以效果很好。但如果您需要任意尺寸,texture_lod_bias 值得一试。
    • GL_TEXTURE_LOD_BIAS 是在 GL_TEXTURE_MIN_FILTER 之前还是之后添加的,它对技术上正确的 LOD 有影响吗?如果之前添加了,-0.5 的 LOD 偏差不应该满足 OP 的要求吗?它肯定会为我提供各种尺寸的更好结果,但我不确定它是否能达到我认为的效果。
    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 2013-04-05
    • 2011-12-25
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2020-08-16
    相关资源
    最近更新 更多