using OpenTK.Graphics.OpenGL4; using StbImageSharp; namespace VoxelEngine.Rendering; public sealed class Texture : IDisposable { private readonly int _handle; public int Width { get; } public int Height { get; } public Texture(string path) { this._handle = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, this._handle); StbImage.stbi_set_flip_vertically_on_load(1); using FileStream stream = File.OpenRead(path); ImageResult image = ImageResult.FromStream(stream, ColorComponents.RedGreenBlueAlpha); this.Width = image.Width; this.Height = image.Height; GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, image.Width, image.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, image.Data); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); } public void Use(TextureUnit unit = TextureUnit.Texture0) { GL.ActiveTexture(unit); GL.BindTexture(TextureTarget.Texture2D, this._handle); } public void Dispose() => GL.DeleteTexture(this._handle); }