OpenGL Mipmapping:OpenGL如何决定地图级别?

时间:2010-05-25 16:51:56

标签: opengl filter textures mipmaps

我在OpenGL中实现mipmapping时遇到了麻烦。我正在使用OpenFrameworks并修改了ofTexture类以支持mipmap的创建和呈现。

以下代码是该类的原始纹理创建代码(为清晰起见略作修改):

  glEnable(texData.textureTarget);
      glBindTexture(texData.textureTarget, (GLuint)texData.textureID);
      glTexSubImage2D(texData.textureTarget, 0, 0, 0, w, h, texData.glType, texData.pixelType, data);
      glTexParameteri(texData.textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
      glTexParameteri(texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glDisable(texData.textureTarget);

这是我的mipmap支持版本:

  glEnable(texData.textureTarget);
       glBindTexture(texData.textureTarget, (GLuint)texData.textureID);
       gluBuild2DMipmaps(texData.textureTarget, texData.glTypeInternal, w, h, texData.glType, texData.pixelType, data);
       glTexParameteri(texData.textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
       glTexParameteri(texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  glDisable(texData.textureTarget);

代码不会产生错误(gluBuild2DMipmaps返回'0')并且渲染纹理没有问题。但是,我认为没有任何区别。

我渲染的场景由z = 0处的“平面方形拼贴”组成。它基本上是一个2D场景。我在绘制图块之前使用“glScale()”放大和缩小。当我缩小时,平铺纹理的像素开始“跳舞”,指示(据我所知)未经过滤的纹理查找。请参阅:http://www.youtube.com/watch?v=b_As2Np3m8A 25秒。

我的问题是:由于我没有移动相机位置,只使用整个场景的缩放,这是否意味着OpenGL无法决定适当的mipmap级别并使用完整的纹理大小(级别0)?

2 个答案:

答案 0 :(得分:1)

除了透视距离之外,Mipmapping还会补偿场景比例。顶点着色器输出(即使您不使用自己的着色器,驱动程序仍会创建)指定每个顶点的屏幕空间坐标和这些顶点的纹理坐标。 GPU将根据将生成的片段的纹素到像素比率来决定使用哪个mip级别。

您在渲染瓷砖时是否设置了GL_LINEAR_MIPMAP_LINEAR?它只在渲染事物时很重要,而不是在创建/加载纹理时。您的包围glEnable / glDisable呼叫也可能需要移动,具体取决于您实际传递的状态。

答案 1 :(得分:0)

如果您的目标是OpenGL> = 1.4,则应该切换到automatic mipmap generation

您可以尝试更改GL_TEXTURE_MIN/MAX_LOD以强制使用特定的mip级别。