OpenGL - 加载纹理数据之前的glGenerateMipmap

时间:2015-04-11 11:11:53

标签: c# opengl mipmaps

在我的代码中,我在实际加载纹理数据(使用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);

1 个答案:

答案 0 :(得分:4)

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未设置为使用mipmapping,或GL_TEXTURE_MAX_LEVEL / GL_TEXTURE_MAX_LOD设置为不使用mipmap。或者甚至更可能的是,你的纹理不会根据它们的尺寸和绘制它们的大小而缩小。
  3. 兼容性配置文件中有GL_GENERATE_MIPMAP个纹理参数。那个会导致纹理内容发生变化时自动生成mipmap。