2

I'm not fully satisfied with the quality obtained with the mipmap automatically generated with this line of code:

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

I thought to create (with Gimp) various scaled version of my texture for every texture used in my game. For example for a texture for a ball I will have:

ball256.png 256x256 px

ball128.png 128x128 px

ball64.png 64x64 px

ball32.png 32x32 px

ball16.png 16x16 px

1. Do you think is a good idea?

2. How can I create a single mipmapped texture from all these images?

4

1 回答 1

6

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

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

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

如果您不想使用我上面提到的标准化格式,您始终可以通过调用glTexImage2D (..., n, ...)其中 n 是 LOD(0 是最高分辨率的细节级别)手动一次加载一个细节级别。当您创建纹理时,您将在每个 LOD 的循环中执行此操作,这实际上是事情的gluBuild2DMipmaps (...)工作方式。

于 2013-11-13T02:16:20.813 回答