internal void LoadFromDisk(string filename) { if (Path.GetExtension(filename).ToLower() == ".dds") { try { ImageDDS.LoadFromDisk(RFileSystem.Instance.GetFilePath(filename), out Id, out textureTarget, out pixelFormat, out pixelType); }catch (Exception e) { RLog.Error("Error loading texture from: " + filename); RLog.Error(e); } } else { try { ImageGDI.LoadFromDisk(RFileSystem.Instance.GetFilePath(filename), out Id, out textureTarget, out pixelFormat, out pixelType); }catch (Exception e) { RLog.Error("Error loading texture from: " + filename); RLog.Error(e); return; } } if (Id == 0 || textureTarget == 0) { RLog.Error("Error generating OpenGL texture from: " + filename); return; } // load succeeded, Texture can be used. Bind(); int max_level = 0; int min_level = 0; REngine.CheckGLError(); GL.TexParameterI(textureTarget, TextureParameterName.TextureBaseLevel, ref min_level); REngine.CheckGLError(); GL.TexParameterI(textureTarget, TextureParameterName.TextureMaxLevel, ref max_level); REngine.CheckGLError(); GL.TexParameter(textureTarget, TextureParameterName.TextureMagFilter, (int)RTextureMagFilter.Linear); REngine.CheckGLError(); GL.TexParameter(textureTarget, TextureParameterName.TextureMinFilter, (int)RTextureMinFilter.Linear); REngine.CheckGLError(); GL.TexParameter(textureTarget, TextureParameterName.TextureMaxLod, 0); REngine.CheckGLError(); GL.TexParameter(textureTarget, TextureParameterName.TextureMinLod, 0); REngine.CheckGLError(); int height, width; GL.GetTexLevelParameter(textureTarget, 0, GetTextureParameter.TextureHeight, out height); REngine.CheckGLError(); GL.GetTexLevelParameter(textureTarget, 0, GetTextureParameter.TextureWidth, out width); REngine.CheckGLError(); Bounds = new Reactor.Math.Rectangle(0, 0, width, height); RLog.Info("Texture loaded from: " + filename); }
internal void LoadFromData(byte[] data, string name, bool isCompressed) { if (isCompressed) { try { ImageDDS.LoadFromData(data, name, out Id, out textureTarget, out pixelFormat, out pixelType); }catch (Exception e) { RLog.Error("Error loading texture for: " + name); RLog.Error(e.Message); RLog.Error(e); } } else { try { ImageGDI.LoadFromData(data, out Id, out textureTarget, out pixelFormat, out pixelType); }catch (Exception e) { RLog.Error("Error loading texture for: " + name); RLog.Error(e.Message); RLog.Error(e); } } if (Id == 0 || textureTarget == 0) { RLog.Error("Error generating OpenGL texture for: " + name); } // load succeeded, Texture can be used. Bind(); GL.TexParameter(textureTarget, TextureParameterName.TextureMagFilter, (int)RTextureMagFilter.Linear); int MipMapCount; GL.GetTexParameter(textureTarget, GetTextureParameter.TextureMaxLevel, out MipMapCount); if (MipMapCount == 0) // if no MipMaps are present, use linear Filter { GL.TexParameter(textureTarget, TextureParameterName.TextureMinFilter, (int)RTextureMinFilter.Linear); } else // MipMaps are present, use trilinear Filter { GL.TexParameter(textureTarget, TextureParameterName.TextureMinFilter, (int)RTextureMinFilter.LinearMipmapLinear); } int height, width; GL.GetTexParameter(textureTarget, GetTextureParameter.TextureHeight, out height); GL.GetTexParameter(textureTarget, GetTextureParameter.TextureWidth, out width); Bounds = new Reactor.Math.Rectangle(0, 0, width, height); RLog.Info("Texture loaded for: " + name); }
/// <summary> /// Loads a texture from a dds file /// </summary> /// <param name="fileName">The file to be loaded</param> /// <returns>The texture object</returns> public static Texture2D FromDdsFile(string fileName) { if (fileName == null) { throw new ArgumentNullException("fileName"); } uint name; TextureTarget dim; ImageDDS.LoadFromDisk(fileName, out name, out dim); if (dim != TextureTarget.Texture2D) { throw new InvalidDataException("Texture was not 2D."); } if (!GL.IsTexture(name)) { throw new InvalidDataException("Texture loading failed."); } return(new Texture2D(name)); }
/// <summary>Setup OpenGL and load resources here.</summary> /// <param name="e">Not used.</param> protected override void OnLoad(EventArgs e) { this.VSync = VSyncMode.Off; // Check for necessary capabilities: string extensions = GL.GetString(StringName.Extensions); if (!GL.GetString(StringName.Extensions).Contains("GL_ARB_shading_language")) { throw new NotSupportedException(String.Format("This example requires OpenGL 2.0. Found {0}. Aborting.", GL.GetString(StringName.Version).Substring(0, 3))); } if (!extensions.Contains("GL_ARB_texture_compression") || !extensions.Contains("GL_EXT_texture_compression_s3tc")) { throw new NotSupportedException("This example requires support for texture compression. Aborting."); } int[] temp = new int[1]; GL.GetInteger(GetPName.MaxTextureImageUnits, out temp[0]); Trace.WriteLine(temp[0] + " TMU's for Fragment Shaders found. (2 required)"); GL.GetInteger(GetPName.MaxVaryingFloats, out temp[0]); Trace.WriteLine(temp[0] + " varying floats between VS and FS allowed. (6 required)"); GL.GetInteger(GetPName.MaxVertexUniformComponents, out temp[0]); Trace.WriteLine(temp[0] + " uniform components allowed in Vertex Shader. (6 required)"); GL.GetInteger(GetPName.MaxFragmentUniformComponents, out temp[0]); Trace.WriteLine(temp[0] + " uniform components allowed in Fragment Shader. (11 required)"); Trace.WriteLine(""); #region GL State GL.ClearColor(0.2f, 0f, 0.4f, 0f); GL.PointSize(10f); GL.Disable(EnableCap.Dither); GL.FrontFace(FrontFaceDirection.Ccw); GL.PolygonMode(MaterialFace.Front, PolygonMode.Fill); GL.PolygonMode(MaterialFace.Back, PolygonMode.Line); #endregion GL State #region Shaders string LogInfo; // Load&Compile Vertex Shader using (StreamReader sr = new StreamReader(VertexShaderFilename)) { VertexShaderObject = GL.CreateShader(ShaderType.VertexShader); GL.ShaderSource(VertexShaderObject, sr.ReadToEnd( )); GL.CompileShader(VertexShaderObject); } GL.GetShaderInfoLog(VertexShaderObject, out LogInfo); if (LogInfo.Length > 0 && !LogInfo.Contains("hardware")) { Trace.WriteLine("Vertex Shader failed!\nLog:\n" + LogInfo); } else { Trace.WriteLine("Vertex Shader compiled without complaint."); } // Load&Compile Fragment Shader using (StreamReader sr = new StreamReader(FragmentShaderFilename)) { FragmentShaderObject = GL.CreateShader(ShaderType.FragmentShader); GL.ShaderSource(FragmentShaderObject, sr.ReadToEnd( )); GL.CompileShader(FragmentShaderObject); } GL.GetShaderInfoLog(FragmentShaderObject, out LogInfo); if (LogInfo.Length > 0 && !LogInfo.Contains("hardware")) { Trace.WriteLine("Fragment Shader failed!\nLog:\n" + LogInfo); } else { Trace.WriteLine("Fragment Shader compiled without complaint."); } // Link the Shaders to a usable Program ProgramObject = GL.CreateProgram( ); GL.AttachShader(ProgramObject, VertexShaderObject); GL.AttachShader(ProgramObject, FragmentShaderObject); // must bind the attribute before linking GL.BindAttribLocation(ProgramObject, AttribTangent, "AttributeTangent"); // link it all together GL.LinkProgram(ProgramObject); // flag ShaderObjects for delete when not used anymore GL.DeleteShader(VertexShaderObject); GL.DeleteShader(FragmentShaderObject); GL.GetProgram(ProgramObject, GetProgramParameterName.LinkStatus, out temp[0]); Trace.WriteLine("Linking Program (" + ProgramObject + ") " + ((temp[0] == 1) ? "succeeded." : "FAILED!")); if (temp[0] != 1) { GL.GetProgramInfoLog(ProgramObject, out LogInfo); Trace.WriteLine("Program Log:\n" + LogInfo); } GL.GetProgram(ProgramObject, GetProgramParameterName.ActiveAttributes, out temp[0]); Trace.WriteLine("Program registered " + temp[0] + " Attributes. (Should be 4: Pos, UV, Normal, Tangent)"); Trace.WriteLine("Tangent attribute bind location: " + GL.GetAttribLocation(ProgramObject, "AttributeTangent")); Trace.WriteLine("End of Shader build. GL Error: " + GL.GetError( )); #endregion Shaders #region Textures TextureLoaderParameters.MagnificationFilter = TextureMagFilter.Linear; TextureLoaderParameters.MinificationFilter = TextureMinFilter.LinearMipmapLinear; TextureLoaderParameters.WrapModeS = TextureWrapMode.ClampToBorder; TextureLoaderParameters.WrapModeT = TextureWrapMode.ClampToBorder; TextureLoaderParameters.EnvMode = TextureEnvMode.Modulate; ImageDDS.LoadFromDisk(TMU0_Filename, out TMU0_Handle, out TMU0_Target); Trace.WriteLine("Loaded " + TMU0_Filename + " with handle " + TMU0_Handle + " as " + TMU0_Target); ImageDDS.LoadFromDisk(TMU1_Filename, out TMU1_Handle, out TMU1_Target); Trace.WriteLine("Loaded " + TMU1_Filename + " with handle " + TMU1_Handle + " as " + TMU1_Target); #endregion Textures Trace.WriteLine("End of Texture Loading. GL Error: " + GL.GetError( )); Trace.WriteLine(""); }