/// <summary> /// generates new mipmaps /// </summary> public TextureArray2D GenerateMipmapLevels(int levels) { Debug.Assert(!HasMipmaps); // create a texture with the same format and more mipmaps var newTex = new TextureArray2D(nLayer, levels, internalFormat, width, height, IsSrgb); // copy image data of first level GL.CopyImageSubData(id, ImageTarget.Texture2DArray, 0, 0, 0, 0, newTex.id, ImageTarget.Texture2DArray, 0, 0, 0, 0, width, height, nLayer); newTex.GenerateMipmaps(); return(newTex); }
/// <summary> /// creates a new texture that has only one mipmap level /// </summary> /// <param name="level">mipmap level to clone</param> /// <returns></returns> public TextureArray2D CloneMipmapLevel(int level) { Debug.Assert(level < nMipmaps); Debug.Assert(level >= 0); GL.GetTexLevelParameter(TextureTarget.Texture2DArray, level, GetTextureParameter.TextureWidth, out int lvlWidth); GL.GetTexLevelParameter(TextureTarget.Texture2DArray, level, GetTextureParameter.TextureHeight, out int lvlHeight); var newTex = new TextureArray2D(nLayer, 1, internalFormat, lvlWidth, lvlHeight, IsSrgb); // copy data of first mipmap level GL.CopyImageSubData(id, ImageTarget.Texture2DArray, level, 0, 0, 0, newTex.id, ImageTarget.Texture2DArray, 0, 0, 0, 0, lvlWidth, lvlHeight, nLayer); return(newTex); }
/// <summary> /// performs a deep gpu copy of the textures /// </summary> /// <returns></returns> public TextureArray2D Clone() { var newTex = new TextureArray2D(nLayer, nMipmaps, internalFormat, width, height, IsSrgb); for (var level = 0; level < nMipmaps; ++level) { GL.GetTexLevelParameter(TextureTarget.Texture2DArray, level, GetTextureParameter.TextureWidth, out int lwidth); GL.GetTexLevelParameter(TextureTarget.Texture2DArray, level, GetTextureParameter.TextureHeight, out int lheight); GL.CopyImageSubData(id, ImageTarget.Texture2DArray, level, 0, 0, 0, newTex.id, ImageTarget.Texture2DArray, level, 0, 0, 0, lwidth, lheight, nLayer); } return(newTex); }