c++ - 如何让 OpenGL 选择最近的较大 mipmap?

标签 c++ opengl

我想使用 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));

但这有效吗?这样是不是就完全不再需要使用 mipmap 了?我可以制作不同的纹理并根据大小选择一种。那么有没有更好的方法来完成这个任务呢?

最佳答案

您可以使用GL_TEXTURE_LOD_BIAS向 mipmap 级别添加常量,这可以帮助您实现此目的(例如,始终选择下一个更高的 mipmap 级别)。然而,可能只是 mipmap-nearest 对于这种情况并不理想。如果您总是在屏幕空间中显示纹理,并且确切地知道字体大小如何与屏幕上的像素相对应,那么 mipmap 对您来说可能太过机械化。

关于c++ - 如何让 OpenGL 选择最近的较大 mipmap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9498306/

相关文章:

c++ - 使用 tesseract 进行字符识别

c++ - 来自字符串 C++ vector 的基元列表

c++ - 如何进行 size_t 乘法

c# - tao SimpleOpenGlControl 出错

java - 3D 相机类无法正常工作

c++ - 在没有 VBO 的情况下在 opengl 3.1+ 中呈现

c++ - inportb() 和 inport() 函数有什么区别?

c++ - 我的 C++ makefile 无法为每个 .cpp 代码创建目标文件

windows - 如何在 Windows 上设置 gl3w?

java - 纹理坐标无法正常工作?