如何手动创建mipmap?

时间:2013-11-12 17:57:12

标签: android opengl-es textures

我对使用这行代码自动生成的mipmap获得的质量不满意:

glTexParameterf(GL10.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL10.GL_TRUE);

我想为我的游戏中使用的每个纹理创建(使用Gimp)我的纹理的各种缩放版本。例如,对于球的纹理,我将:

ball256.png 256x256 px

ball128.png 128x128 px

ball64.png 64x64 px

ball32.png 32x32 px

ball16.png 16x16 px

1。你认为这是个好主意吗?

2. 如何从所有这些图片中创建单个mipmap纹理?

1 个答案:

答案 0 :(得分:5)

这不仅是一个好主意,而且是一种非常标准的做法(特别是在Direct3D中)!

在生成mipmap时,OpenGL实现倾向于使用标准的框过滤器(统一加权)。在图像编辑套件中对纹理进行下采样时,您可以使用漂亮的帐篷(双线性)或甚至三次样条(双三次)。就个人而言,我更喜欢lanczos过滤器,因为这将是离线完成的。

您可能已经意识到这一点,但Direct3D有一种称为DDS(Direct Draw Surface)的标准纹理格式,它允许您在内容创建时而不是加载时预先计算和预压缩每个mipmap级别。这减少了压缩纹理加载时间,并且更重要的是,在下采样到每个LOD期间允许更高质量的样本重建。 OpenGL也有一个标准化的格式,可以做同样的事情:KTX。我提出了Direct3D,因为尽管OpenGL具有标准化格式,但似乎很少有人知道它; DDS对大多数人来说更为熟悉。

如果您不想使用我上面提到的标准化格式,您可以随时通过调用glTexImage2D (..., n, ...)手动加载您的详细程度,其中n是LOD(0是最高的)分辨率细节)。在创建纹理时,您可以在每个LOD的循环中执行此操作,这实际上就像gluBuild2DMipmaps (...)之类的工作方式。