3

我无法在 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)?

保罗

4

2 回答 2

1

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

GL_LINEAR_MIPMAP_LINEAR当你渲染你的瓷砖时你也在设置吗?仅在渲染事物时才重要,而不是在创建/加载纹理时。您的包围 glEnable/glDisable 调用也可能需要移动,具体取决于您实际传递的状态。

于 2010-05-25T19:47:15.203 回答
-1

如果您的目标是 OpenGL >= 1.4,您可能应该切换到自动生成 mipmap 。

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

于 2010-05-25T19:14:56.437 回答