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 LoadTextureForModelExternal(string filename) { if (!File.Exists(filename)) { return(-1); } if (filename.ToLower().EndsWith("dds")) { return(LoadTextureCompressedWithMipMaps(filename)); } int texID; try { Bitmap image = new Bitmap(filename); if (image == null) { HelperGeneral.ShowErrorAndQuit("HelperTexture::LoadTextureForModelExternal()", "File " + filename + " is not a valid image file."); 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::LoadTextureForModelExternal()", "Could not load image file " + filename + "! Make sure to copy it to the correct output directory. " + "[" + ex.Message + "]"); return(-1); } return(texID); }
/// <summary> /// Berechnet die Position eines Punkts, der um einen angegeben Punkt entlang einer Achse rotiert wird /// </summary> /// <param name="point">Mittelpunkt der Rotation</param> /// <param name="distance">Distanz zum Mittelpunkt</param> /// <param name="degrees">Grad der Rotation</param> /// <param name="plane">Achse der Rotation (Standard: Y)</param> /// <returns>Position des rotierten Punkts</returns> public static Vector3 CalculateRotationAroundPointOnAxis(Vector3 point, float distance, float degrees, Plane plane = Plane.Y) { float radians = MathHelper.DegreesToRadians(degrees % 360); Matrix4.CreateTranslation(ref point, out translationPointMatrix); if (plane == Plane.X) { Matrix4.CreateRotationX(radians, out rotationMatrix); Matrix4.CreateTranslation(0, 0, distance, out translationMatrix); } else if (plane == Plane.Y) { Matrix4.CreateRotationY(radians, out rotationMatrix); Matrix4.CreateTranslation(0, 0, distance, out translationMatrix); } else if (plane == Plane.Z) { Matrix4.CreateRotationZ(radians, out rotationMatrix); Matrix4.CreateTranslation(0, distance, 0, out translationMatrix); } else if (plane == Plane.Camera) { if (KWEngine.CurrentWorld != null) { Vector3 camLookAt; if (KWEngine.CurrentWorld.IsFirstPersonMode) { camLookAt = KWEngine.CurrentWorld.GetFirstPersonObject().GetLookAtVector(); } else { camLookAt = KWEngine.CurrentWorld.GetCameraLookAtVector(); } rotationMatrix = HelperMatrix.CreateRotationMatrixForAxisAngle(ref camLookAt, ref radians); Vector3 cross = Vector3.Cross(camLookAt, KWEngine.WorldUp); Matrix4.CreateTranslation(-cross.X, -cross.Y, -cross.Z, out translationMatrix); } else { HelperGeneral.ShowErrorAndQuit("HelperRotation::CalculateRotationAroundPointOnAxis()", "CurrentWorld is not set. Cannot rotate around a camera axis that does not exist."); return(Vector3.Zero); } } Matrix4.Mult(ref translationMatrix, ref rotationMatrix, out tempMatrix); Matrix4.Mult(ref tempMatrix, ref translationPointMatrix, out spinMatrix); Vector3.TransformPosition(ref zeroVector, ref spinMatrix, out finalTranslationPoint); return(finalTranslationPoint); }
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); }
internal static int LoadTextureFromAssembly(string resourceName, Assembly assembly) { int texID = -1; using (Stream s = assembly.GetManifestResourceStream(resourceName)) { Bitmap image = new Bitmap(s); if (image == null) { HelperGeneral.ShowErrorAndQuit("HelperTexture::LoadTextureFromAssembly()", "File " + resourceName + " is not a valid image file."); 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); } return(texID); }
public static Matrix3 GetViewMatrixInversed() { if (mCurrentGameObject != null) { Vector3 pos = mCurrentGameObject.Position; Vector3 lookat = new Vector3(); lookat.X = (float)(Math.Sin((float)mOrientation.X) * Math.Cos((float)mOrientation.Y)); lookat.Y = (float)Math.Sin((float)mOrientation.Y); lookat.Z = (float)(Math.Cos((float)mOrientation.X) * Math.Cos((float)mOrientation.Y)); pos.Y = pos.Y + mCurrentGameObject.FPSEyeOffset; return(new Matrix3(Matrix4.LookAt(pos, pos - lookat, KWEngine.WorldUp))); } else { HelperGeneral.ShowErrorAndQuit("HelperCamera::GetViewMatrix()", "No first person object available."); return(Matrix3.Identity); } }
internal static void CreateFramebuffer() { _fbFull = GL.GenFramebuffer(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, _fbFull); int renderedTexture = GL.GenTexture(); int renderedTextureAttachment = GL.GenTexture(); int depthTexId = GL.GenTexture(); GL.DrawBuffers(2, new DrawBuffersEnum[2] { DrawBuffersEnum.ColorAttachment0, DrawBuffersEnum.ColorAttachment1 }); GL.BindTexture(TextureTarget.Texture2D, renderedTexture); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, _resolution, _resolution, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)TextureParameterName.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)TextureParameterName.ClampToEdge); //render buffer fsaa: int renderbufferFSAA = GL.GenRenderbuffer(); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderbufferFSAA); GL.RenderbufferStorageMultisample(RenderbufferTarget.Renderbuffer, 8, RenderbufferStorage.Rgba8, _resolution, _resolution); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, RenderbufferTarget.Renderbuffer, renderbufferFSAA); GL.BindTexture(TextureTarget.Texture2D, renderedTextureAttachment); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, _resolution, _resolution, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)TextureParameterName.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)TextureParameterName.ClampToEdge); int renderbufferFSAA2 = GL.GenRenderbuffer(); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderbufferFSAA2); GL.RenderbufferStorageMultisample(RenderbufferTarget.Renderbuffer, 8, RenderbufferStorage.Rgba8, _resolution, _resolution); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment1, RenderbufferTarget.Renderbuffer, renderbufferFSAA2); // depth buffer fsaa: int depthRenderBuffer = GL.GenRenderbuffer(); GL.BindTexture(TextureTarget.Texture2D, depthTexId); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.DepthComponent32, _resolution, _resolution, 0, OpenTK.Graphics.OpenGL4.PixelFormat.DepthComponent, PixelType.Float, IntPtr.Zero); GL.TexParameterI(TextureTarget.Texture2D, TextureParameterName.TextureCompareMode, new int[] { (int)TextureCompareMode.CompareRefToTexture }); GL.TexParameterI(TextureTarget.Texture2D, TextureParameterName.TextureCompareFunc, new int[] { (int)DepthFunction.Lequal }); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)TextureParameterName.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)TextureParameterName.ClampToEdge); GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, depthTexId, 0); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthRenderBuffer); GL.RenderbufferStorageMultisample(RenderbufferTarget.Renderbuffer, 8, RenderbufferStorage.DepthComponent32, _resolution, _resolution); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, RenderbufferTarget.Renderbuffer, depthRenderBuffer); FramebufferErrorCode code = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); if (code != FramebufferErrorCode.FramebufferComplete) { HelperGeneral.ShowErrorAndQuit("HelperSkybox::CreateFramebuffer()", "GL_FRAMEBUFFER_COMPLETE failed. Cannot use FrameBuffer object."); return; } else { _tex0 = renderedTexture; _tex1 = renderedTextureAttachment; _texDepth = depthTexId; } GL.BindTexture(TextureTarget.Texture2D, 0); // Downsample fb: _fbDownsample = GL.GenFramebuffer(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, _fbDownsample); // Init der Textur auf die gerendet wird: renderedTexture = GL.GenTexture(); renderedTextureAttachment = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, renderedTexture); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, _resolution, _resolution, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)TextureParameterName.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)TextureParameterName.ClampToEdge); GL.BindTexture(TextureTarget.Texture2D, renderedTextureAttachment); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, _resolution, _resolution, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)TextureParameterName.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)TextureParameterName.ClampToEdge); //Konfig. des frame buffer: GL.DrawBuffers(2, new DrawBuffersEnum[2] { DrawBuffersEnum.ColorAttachment0, DrawBuffersEnum.ColorAttachment1 }); GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, renderedTexture, 0); GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment1, renderedTextureAttachment, 0); code = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); if (code != FramebufferErrorCode.FramebufferComplete) { HelperGeneral.ShowErrorAndQuit("HelperSkybox::CreateFramebuffer()", "GL_FRAMEBUFFER_COMPLETE failed. Cannot use FrameBuffer object."); return; } else { _tex0d = renderedTexture; _tex1d = renderedTextureAttachment; } }
internal static void InitFramebufferBloom() { int framebufferTempId; int renderedTextureTemp; // =========== TEMP =========== //Init des frame buffer: framebufferTempId = GL.GenFramebuffer(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebufferTempId); // Init der Textur auf die gerendet wird: renderedTextureTemp = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, renderedTextureTemp); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, _resolution, _resolution, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)TextureParameterName.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)TextureParameterName.ClampToEdge); //Konfig. des frame buffer: GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, renderedTextureTemp, 0); GL.DrawBuffer(DrawBufferMode.ColorAttachment0); FramebufferErrorCode code = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); if (code != FramebufferErrorCode.FramebufferComplete) { HelperGeneral.ShowErrorAndQuit("HelperSkybox::InitFramebufferBloom()", "GL_FRAMEBUFFER_COMPLETE failed. Cannot use FrameBuffer object."); return; } else { _fbBloom1 = framebufferTempId; _fbBloomTex0 = renderedTextureTemp; } // =========== TEMP 2 =========== //Init des frame buffer: int framebufferId = GL.GenFramebuffer(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebufferId); // Init der Textur auf die gerendet wird: int renderedTextureTemp2 = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, renderedTextureTemp2); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, _resolution, _resolution, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)TextureParameterName.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)TextureParameterName.ClampToEdge); //Konfig. des frame buffer: GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, renderedTextureTemp2, 0); GL.DrawBuffer(DrawBufferMode.ColorAttachment0); code = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); if (code != FramebufferErrorCode.FramebufferComplete) { HelperGeneral.ShowErrorAndQuit("HelperSkybox::InitFramebufferBloom()", "GL_FRAMEBUFFER_COMPLETE failed. Cannot use FrameBuffer object."); return; } else { _fbBloom2 = framebufferId; _fbBloomTex1 = renderedTextureTemp2; } }
internal static int LoadTextureSkybox(string filename, bool isInAssembly = false) { Assembly a = Assembly.GetEntryAssembly(); if (!filename.ToLower().EndsWith("jpg") && !filename.ToLower().EndsWith("jpeg") && !filename.ToLower().EndsWith("png") && !filename.ToLower().EndsWith("dds")) { HelperGeneral.ShowErrorAndQuit("HelperTexture::LoadTextureSkybox()", "Only JPG, PNG and DDS (DXT1/3/5) files are supported."); return(-1); } if (!KWEngine.CustomTextures[KWEngine.CurrentWorld].ContainsKey(filename)) { int mipMapCount = 0; try { using (Stream s = isInAssembly ? a.GetManifestResourceStream(a.GetName().Name + "." + filename) : File.Open(filename, FileMode.Open)) { if (filename.ToLower().EndsWith(".dds")) { int textureId = -1; HelperDDS2.TryLoadDDSCubeMap(s, false, out textureId, out mipMapCount); return(textureId); } Bitmap image = new Bitmap(s); int width = image.Width; int height = image.Height; int height_onethird = height / 3; int width_onequarter = width / 4; Bitmap image_front = new Bitmap(width_onequarter, height_onethird, image.PixelFormat); Bitmap image_back = new Bitmap(width_onequarter, height_onethird, image.PixelFormat); Bitmap image_up = new Bitmap(width_onequarter, height_onethird, image.PixelFormat); Bitmap image_down = new Bitmap(width_onequarter, height_onethird, image.PixelFormat); Bitmap image_left = new Bitmap(width_onequarter, height_onethird, image.PixelFormat); Bitmap image_right = new Bitmap(width_onequarter, height_onethird, image.PixelFormat); Graphics g = null; //front g = Graphics.FromImage(image_front); g.DrawImage(image, new Rectangle(0, 0, width_onequarter, height_onethird), new Rectangle(2 * width_onequarter, height_onethird, width_onequarter, height_onethird), GraphicsUnit.Pixel ); g.Dispose(); //back g = Graphics.FromImage(image_back); g.DrawImage(image, new Rectangle(0, 0, width_onequarter, height_onethird), new Rectangle(0, height_onethird, width_onequarter, height_onethird), GraphicsUnit.Pixel ); g.Dispose(); //up g = Graphics.FromImage(image_up); g.DrawImage(image, new Rectangle(0, 0, width_onequarter, height_onethird), new Rectangle(width_onequarter, 0, width_onequarter, height_onethird), GraphicsUnit.Pixel ); g.Dispose(); //down g = Graphics.FromImage(image_down); g.DrawImage(image, new Rectangle(0, 0, width_onequarter, height_onethird), new Rectangle(width_onequarter, 2 * height_onethird, width_onequarter, height_onethird), GraphicsUnit.Pixel ); g.Dispose(); //left g = Graphics.FromImage(image_left); g.DrawImage(image, new Rectangle(0, 0, width_onequarter, height_onethird), new Rectangle(width_onequarter, height_onethird, width_onequarter, height_onethird), GraphicsUnit.Pixel ); g.Dispose(); //right g = Graphics.FromImage(image_right); g.DrawImage(image, new Rectangle(0, 0, width_onequarter, height_onethird), new Rectangle(3 * width_onequarter, height_onethird, width_onequarter, height_onethird), GraphicsUnit.Pixel ); g.Dispose(); int newTexture = GL.GenTexture(); GL.BindTexture(TextureTarget.TextureCubeMap, newTexture); BitmapData data = null; PixelInternalFormat iFormat = image.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb ? PixelInternalFormat.Rgb : PixelInternalFormat.Rgba; OpenTK.Graphics.OpenGL4.PixelFormat pxFormat = image.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb ? OpenTK.Graphics.OpenGL4.PixelFormat.Bgr : OpenTK.Graphics.OpenGL4.PixelFormat.Bgra; // front data = image_front.LockBits(new Rectangle(0, 0, image_front.Width, image_front.Height), ImageLockMode.ReadOnly, image.PixelFormat); GL.TexImage2D(TextureTarget.TextureCubeMapPositiveX, 0, iFormat, data.Width, data.Height, 0, pxFormat, PixelType.UnsignedByte, data.Scan0); image_front.UnlockBits(data); // back data = image_back.LockBits(new Rectangle(0, 0, image_back.Width, image_back.Height), ImageLockMode.ReadOnly, image.PixelFormat); GL.TexImage2D(TextureTarget.TextureCubeMapNegativeX, 0, iFormat, data.Width, data.Height, 0, pxFormat, PixelType.UnsignedByte, data.Scan0); image_back.UnlockBits(data); // up data = image_up.LockBits(new Rectangle(0, 0, image_up.Width, image_up.Height), ImageLockMode.ReadOnly, image.PixelFormat); GL.TexImage2D(TextureTarget.TextureCubeMapPositiveY, 0, iFormat, data.Width, data.Height, 0, pxFormat, PixelType.UnsignedByte, data.Scan0); image_up.UnlockBits(data); // down data = image_down.LockBits(new Rectangle(0, 0, image_down.Width, image_down.Height), ImageLockMode.ReadOnly, image.PixelFormat); GL.TexImage2D(TextureTarget.TextureCubeMapNegativeY, 0, iFormat, data.Width, data.Height, 0, pxFormat, PixelType.UnsignedByte, data.Scan0); image_down.UnlockBits(data); // left data = image_left.LockBits(new Rectangle(0, 0, image_left.Width, image_left.Height), ImageLockMode.ReadOnly, image.PixelFormat); GL.TexImage2D(TextureTarget.TextureCubeMapPositiveZ, 0, iFormat, data.Width, data.Height, 0, pxFormat, PixelType.UnsignedByte, data.Scan0); image_left.UnlockBits(data); // right data = image_right.LockBits(new Rectangle(0, 0, image_right.Width, image_right.Height), ImageLockMode.ReadOnly, image.PixelFormat); GL.TexImage2D(TextureTarget.TextureCubeMapNegativeZ, 0, iFormat, data.Width, data.Height, 0, pxFormat, PixelType.UnsignedByte, data.Scan0); image_right.UnlockBits(data); GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapR, (int)TextureWrapMode.ClampToEdge); GL.GenerateMipmap(GenerateMipmapTarget.TextureCubeMap); mipMapCount = GetMaxMipMapLevels(width_onequarter, height_onethird); GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureBaseLevel, 0); GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMaxLevel, Math.Max(0, mipMapCount - 2)); KWEngine.CustomTextures[KWEngine.CurrentWorld].Add(filename, newTexture); image.Dispose(); image_front.Dispose(); image_back.Dispose(); image_up.Dispose(); image_down.Dispose(); image_left.Dispose(); image_right.Dispose(); GL.BindTexture(TextureTarget.TextureCubeMap, 0); return(newTexture); } } catch (Exception ex) { Debug.WriteLine("Error loading skybox texture: " + filename + " (" + ex.Message + ")"); return(-1); } } else { int id = -1; KWEngine.CustomTextures[KWEngine.CurrentWorld].TryGetValue(filename, out id); return(id); } }
public static int LoadTextureForModelInternal(string filename, bool convertRoughnessToSpecular = false) { Assembly a = Assembly.GetEntryAssembly(); int texID; if (filename.ToLower().EndsWith("dds")) { string assPath = a.GetName().Name + "." + filename; using (Stream s = a.GetManifestResourceStream(assPath)) texID = LoadTextureCompressedWithMipMaps(s); return(texID); } try { string assPath = a.GetName().Name + "." + filename; using (Stream s = a.GetManifestResourceStream(assPath)) { Bitmap image = new Bitmap(s); if (image == null) { HelperGeneral.ShowErrorAndQuit("HelperTexture::LoadTextureForModelInternal()", "Could not load image file! Make sure to copy it to the correct output directory."); 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) { HelperGeneral.ShowErrorAndQuit("HelperTexture::LoadTextureForModel()", "Could not load image file from assembly: " + filename); return(-1); } return(texID); }