【发布时间】: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。