【问题标题】:OpenGL - glGenerateMipmap before loading texture dataOpenGL-加载纹理数据之前的glGenerateMipmap
【发布时间】:2015-04-11 11:11:53
【问题描述】:

在我的代码中,我在实际加载纹理数据之前调用了glGenerateMipmap(使用glTexImage2D),但我注意到它似乎仍然有效......

这是为什么呢?调用 glGenerateMipmap 是否会导致未来的 glTexImage2D 调用也创建 mipmap 数据?

代码(我使用 C# 和 OpenTK):

int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int) TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.LinearMipmapLinear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMagFilter.Linear);

// if I comment this line it results in triangles being black - suggesting mipmaps are being used
// (otherwise it works just fine)
GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);

BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
            ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmpData.Width, bmpData.Height, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bmpData.Scan0);

bitmap.UnlockBits(bmpData);

【问题讨论】:

  • 它不应该以这种方式工作,但是当您调用未定义的行为时,一切皆有可能。 glGenerateMipmaps (...) 获取图像 LOD 0 并通过将所有剩余 LOD 降采样到 1x1 来生成 mipchain。这当然只有在分配图像 LOD 0 时才有意义,直到您调用 glTexImage2D

标签: c# opengl mipmaps


【解决方案1】:

glGenerateMipmap() 获取基础级别图像的当前内容(其中基础级别是设置为GL_TEXTURE_BASE_LEVEL 的级别,默认为0),并从基础级别生成所有mipmap 级别+ 1 到最高等级。

这意味着glGenerateMipmap() 对以后对glTexImage2D() 的调用没有影响。如果您希望在使用glTexImage2D()glTexSubImage2D() 等调用修改纹理数据后更新mipmap,则必须再次调用glGenerateMipmap()

如果看起来你的 mipmap 是自动更新的,我可以想到两种可能的解释:

  1. 您的 OpenGL 实现做了一些规范没有要求的事情。事实上,我认为它已损坏,因为它不应该更改您的 glTex[Sub]Image2D() 调用未明确修改的纹理级别。之前生成的 mipmap 应该保持不变。
  2. 您并没有真正使用 mipmapping。您的 GL_TEXTURE_MIN_FILTER 未设置为使用 mipmap,或者 GL_TEXTURE_MAX_LEVEL/GL_TEXTURE_MAX_LOD 设置为不使用 mipmap。或者更有可能的是,您的纹理并没有根据它们的尺寸和绘制大小进行缩小。

兼容性配置文件中有一个GL_GENERATE_MIPMAP 纹理参数。这会导致在纹理内容发生变化时自动生成 mipmap。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2013-11-27
    • 2017-06-11
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多