public static int LoadTextureForModelGLB(byte[] rawTextureData) { int texID; if (rawTextureData[0] == 0x44 && rawTextureData[1] == 0x44 && rawTextureData[2] == 0x53) { HelperDDS2.TryLoadDDS(rawTextureData, false, out texID, out int width, out int height); return(texID); } try { using (MemoryStream ms = new MemoryStream(rawTextureData)) { Bitmap image = new Bitmap(ms); if (image == null) { HelperGeneral.ShowErrorAndQuit("HelperTexture::LoadTextureForModelGLB()", "Could not load image file from GLB!"); return(-1); } texID = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, texID); BitmapData data = null; if (image.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb) { data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); } else { data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0); } GL.TexParameter(TextureTarget.Texture2D, (TextureParameterName)OpenTK.Graphics.OpenGL.ExtTextureFilterAnisotropic.TextureMaxAnisotropyExt, GLWindow.CurrentWindow.AnisotropicFiltering); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); int mipMapCount = GetMaxMipMapLevels(data.Width, data.Height); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBaseLevel, 0); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMaxLevel, Math.Max(0, mipMapCount - 2)); image.UnlockBits(data); image.Dispose(); GL.BindTexture(TextureTarget.Texture2D, 0); } } catch (Exception ex) { HelperGeneral.ShowErrorAndQuit("HelperTexture::LoadTextureForModelGLB()", "Could not load image file! Make sure to copy it to the correct output directory. " + "[" + ex.Message + "]"); return(-1); } return(texID); }
public static int LoadTextureForBackgroundExternal(string filename) { if (!File.Exists(filename)) { Debug.WriteLine("File " + filename + " for setting background image not found."); return(-1); } int texID; if (filename.ToLower().EndsWith(".dds")) { HelperDDS2.TryLoadDDS(filename, false, out texID, out int width, out int height, true); return(texID); } try { Bitmap image = new Bitmap(filename); if (image == null) { throw new Exception("File " + filename + " is not a valid image file."); } texID = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, texID); BitmapData data = null; if (image.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb) { data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); } else { data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0); } GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); int mipMapCount = GetMaxMipMapLevels(data.Width, data.Height); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBaseLevel, 0); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMaxLevel, Math.Max(0, mipMapCount - 2)); image.UnlockBits(data); image.Dispose(); GL.BindTexture(TextureTarget.Texture2D, 0); } catch (Exception ex) { throw new Exception("Could not load image file " + filename + "! Make sure to copy it to the correct output directory. " + "[" + ex.Message + "]"); } return(texID); }
public static int LoadTextureCompressedWithMipMaps(Stream stream) { bool success = HelperDDS2.TryLoadDDS(stream, false, out int texID, out int width, out int height); if (!success) { HelperGeneral.ShowErrorAndQuit("HelperTexture::LoadTextureCompressedWithMipMaps()", "Unsupported compressed texture format: only DXT1, DXT3 and DXT5 are supported."); texID = -1; throw new Exception("Unsupported compressed texture format: only DXT1, DXT3 and DXT5 are supported."); } return(texID); }
public static int LoadTextureForBackgroundInternal(string assemblyPathAndName) { Assembly a = Assembly.GetEntryAssembly(); int texID; if (assemblyPathAndName.ToLower().EndsWith(".dds")) { using (Stream s = a.GetManifestResourceStream(a.GetName().Name + "." + assemblyPathAndName)) { HelperDDS2.TryLoadDDS(s, false, out texID, out int width, out int height, true); } return(texID); } try { using (Stream s = a.GetManifestResourceStream(a.GetName().Name + "." + assemblyPathAndName)) { Bitmap image = new Bitmap(s); if (image == null) { throw new Exception("File " + assemblyPathAndName + " not found or not a valid image file."); } texID = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, texID); BitmapData data = null; if (image.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb) { data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); } else { data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0); } //GL.TexParameter(TextureTarget.Texture2D, (TextureParameterName)OpenTK.Graphics.OpenGL.ExtTextureFilterAnisotropic.TextureMaxAnisotropyExt, GLWindow.CurrentWindow.AnisotropicFiltering); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); int mipMapCount = GetMaxMipMapLevels(data.Width, data.Height); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBaseLevel, 0); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMaxLevel, Math.Max(0, mipMapCount - 2)); image.UnlockBits(data); image.Dispose(); GL.BindTexture(TextureTarget.Texture2D, 0); } } catch (Exception) { throw new Exception("Could not load image file " + assemblyPathAndName + "!"); } return(texID); }