public Texture(string name, Bitmap image, bool generateMipmaps, bool srgb) { Name = name; Width = image.Width; Height = image.Height; InternalFormat = srgb ? Srgb8Alpha8 : SizedInternalFormat.Rgba8; if (generateMipmaps) { MipmapLevels = (int)Math.Floor(Math.Log(Math.Max(Width, Height), 2)); } else { MipmapLevels = 1; } OpenGlUtils.CheckGLError("Clear"); OpenGlUtils.CreateTexture(TextureTarget.Texture2D, Name, out GLTexture); GL.TextureStorage2D(GLTexture, MipmapLevels, InternalFormat, Width, Height); OpenGlUtils.CheckGLError("Storage2d"); BitmapData data = image.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, global::System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TextureSubImage2D(GLTexture, 0, 0, 0, Width, Height, PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); OpenGlUtils.CheckGLError("SubImage"); image.UnlockBits(data); if (generateMipmaps) { GL.GenerateTextureMipmap(GLTexture); } GL.TextureParameter(GLTexture, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); OpenGlUtils.CheckGLError("WrapS"); GL.TextureParameter(GLTexture, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); OpenGlUtils.CheckGLError("WrapT"); GL.TextureParameter(GLTexture, TextureParameterName.TextureMinFilter, (int)(generateMipmaps ? TextureMinFilter.Linear : TextureMinFilter.LinearMipmapLinear)); GL.TextureParameter(GLTexture, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); OpenGlUtils.CheckGLError("Filtering"); GL.TextureParameter(GLTexture, TextureParameterName.TextureMaxLevel, MipmapLevels - 1); GL.TexParameter(TextureTarget.Texture2D, (TextureParameterName)OpenTK.Graphics.ES11.ExtTextureFilterAnisotropic.TextureMaxAnisotropyExt, MaxAniso); OpenGlUtils.CheckGLError("Anisotropic"); image.Dispose(); }
public Texture(string name, int width, int height, IntPtr data, bool generateMipmaps = false, bool srgb = false) { Name = name; Width = width; Height = height; InternalFormat = srgb ? Srgb8Alpha8 : SizedInternalFormat.Rgba8; MipmapLevels = generateMipmaps == false ? 1 : (int)Math.Floor(Math.Log(Math.Max(Width, Height), 2)); OpenGlUtils.CreateTexture(TextureTarget.Texture2D, Name, out GLTexture); GL.TextureStorage2D(GLTexture, MipmapLevels, InternalFormat, Width, Height); GL.TextureSubImage2D(GLTexture, 0, 0, 0, Width, Height, PixelFormat.Bgra, PixelType.UnsignedByte, data); if (generateMipmaps) { GL.GenerateTextureMipmap(GLTexture); } SetWrap(TextureCoordinate.S, TextureWrapMode.Repeat); SetWrap(TextureCoordinate.T, TextureWrapMode.Repeat); GL.TextureParameter(GLTexture, TextureParameterName.TextureMaxLevel, MipmapLevels - 1); }
public void SetAnisotropy(float level) { const TextureParameterName TEXTURE_MAX_ANISOTROPY = (TextureParameterName)0x84FE; GL.TextureParameter(GLTexture, TEXTURE_MAX_ANISOTROPY, OpenGlUtils.Clamp(level, 1, MaxAniso)); }