/// <summary> /// シェーダーとログを指定して作成する /// </summary> /// <param name="shader">シェーダー</param> /// <param name="type">シェーダーの種類</param> /// <param name="infoLog">ログ</param> public CompileShaderException(int shader, OpenTK.Graphics.OpenGL.ShaderType type, string infoLog) : base() { // シェーダーとログを設定 this.Shader = shader; this.Type = type; this.InfoLog = infoLog; }
private int CreateShader(string shaderSource, ShaderType type) { int shaderHandle = GL.CreateShader(type); GL.ShaderSource(shaderHandle, shaderSource); GL.CompileShader(shaderHandle); Console.WriteLine(GL.GetShaderInfoLog(shaderHandle)); return(shaderHandle); }
//TODO: Move to Core? Dev calls LoadShaders from Core, it analyzes shaders and tells runtime there's shaders to do //So this should be scanning for shaders and sending them to appropriate facility //todo: this side of the renderer should have separate classes for each renderer containing things like that, keep away from plugin since why would it have a xml parser. actually it's about the shadertype type, overrides should be the soluttion public static System.Collections.Generic.Dictionary <System.String, System.Collections.Generic.Dictionary <OpenTK.Graphics.OpenGL.ShaderType, System.String> > GetShaders(System.Xml.XmlDocument definitionFile) { if (definitionFile.GetElementsByTagName("shaderPackage").Count.Equals(0)) { throw new System.Exception("Invalid shader definition file."); } System.Collections.Generic.Dictionary <OpenTK.Graphics.OpenGL.ShaderType, System.String> shaderGroup = new System.Collections.Generic.Dictionary <OpenTK.Graphics.OpenGL.ShaderType, System.String>(7); System.Collections.Generic.Dictionary <System.String, System.Collections.Generic.Dictionary <OpenTK.Graphics.OpenGL.ShaderType, System.String> > shaderPackage = new System.Collections.Generic.Dictionary <System.String, System.Collections.Generic.Dictionary <OpenTK.Graphics.OpenGL.ShaderType, System.String> >(); System.Xml.XmlNodeList groups = definitionFile.GetElementsByTagName("shaderGroup"); foreach (System.Xml.XmlNode group in groups) { System.String namen = group.Attributes["name"].Value; foreach (System.Xml.XmlNode shader in group) { System.String type = shader.Attributes["type"].Value; OpenTK.Graphics.OpenGL.ShaderType shaderType = OpenTK.Graphics.OpenGL.ShaderType.VertexShader; //init to keep vs silent switch (type) { case "vertex": shaderType = OpenTK.Graphics.OpenGL.ShaderType.VertexShader; break; case "fragment": shaderType = OpenTK.Graphics.OpenGL.ShaderType.FragmentShader; break; case "geometry": shaderType = OpenTK.Graphics.OpenGL.ShaderType.GeometryShader; break; case "compute": shaderType = OpenTK.Graphics.OpenGL.ShaderType.ComputeShader; break; case "tessControl": shaderType = OpenTK.Graphics.OpenGL.ShaderType.TessControlShader; break; case "tessEval": shaderType = OpenTK.Graphics.OpenGL.ShaderType.TessEvaluationShader; break; default: throw new System.Exception("Invalid shader type."); } switch (shader.Name) { case "shaderCode": shaderGroup.Add(shaderType, shader.InnerText); break; case "shaderFile": shaderGroup.Add(shaderType, System.IO.File.ReadAllText("Shaders\\" + shader.InnerText)); break; default: throw new System.Exception("Invalid shader source designator."); } } shaderPackage.Add(namen, shaderGroup); shaderGroup.Clear(); } return(shaderPackage); }
protected void LoadShader(string filename, ShaderType type, int program, out int address) { if (!File.Exists(filename)) { Console.WriteLine($"File not found: {filename}"); address = -1; return; } address = GL.CreateShader(type); using (var sr = new StreamReader(filename)) { GL.ShaderSource(address, sr.ReadToEnd()); } GL.CompileShader(address); GL.AttachShader(program, address); Console.WriteLine(GL.GetShaderInfoLog(address)); }
public static int ShaderTypeToInt(OpenTK.Graphics.OpenGL.ShaderType type) { switch (type) { case OpenTK.Graphics.OpenGL.ShaderType.FragmentShader: return(1); case OpenTK.Graphics.OpenGL.ShaderType.GeometryShader: return(2); case OpenTK.Graphics.OpenGL.ShaderType.VertexShader: return(0); default: throw new ContentException("Unknown ShaderType."); } }
/// <summary> /// Build a shader /// </summary> /// <param name="type">The gl type of shader</param> /// <param name="shader_source">The shader_source.</param> /// <returns>The reference to the shader</returns> private int BuildShader(OpenTK.Graphics.OpenGL.ShaderType type, string shader_source) { int shader = OpenTK.Graphics.OpenGL.GL.CreateShader(type); unsafe { int length = shader_source.Length; OpenTK.Graphics.OpenGL.GL.ShaderSource(shader, 1, new string[] { shader_source }, &length); OpenTK.Graphics.OpenGL.GL.CompileShader(shader); string infoLog = OpenTK.Graphics.OpenGL.GL.GetShaderInfoLog(shader); // TODO: Change this to a different logger Debug.WriteLine(infoLog); } return(shader); }
public ShaderManager(string shaderDir) { allShaders = new List <Shader>(); allPrograms = new List <ShaderProgram>(); Dictionary <string, string> shaderSources = new Dictionary <string, string>(); // Load all shaders string[] files = Directory.GetFiles(shaderDir); string sourceType = ".ss"; foreach (string shaderFile in files) { if (shaderFile.Contains(sourceType)) { string fileName = GetFilenameFromPath(shaderFile); shaderSources.Add(fileName, GetSourceFromFile(shaderFile)); Logger.LogInfo("Saved shader source " + fileName); } } string vertexType = ".vs"; string fragmentType = ".fs"; foreach (string shaderFile in files) { // Check shader type // Create shader OpenTK.Graphics.OpenGL.ShaderType sType = OpenTK.Graphics.OpenGL.ShaderType.VertexShader; if (shaderFile.Contains(vertexType)) { sType = OpenTK.Graphics.OpenGL.ShaderType.VertexShader; } else if (shaderFile.Contains(fragmentType)) { sType = OpenTK.Graphics.OpenGL.ShaderType.FragmentShader; } else { continue; } string shaderName = GetFilenameFromPath(shaderFile); string shaderSource = GetSourceFromFile(shaderFile); if (sType == OpenTK.Graphics.OpenGL.ShaderType.FragmentShader) { Logger.LogInfoLinePart("Fragment shader ", System.ConsoleColor.Gray); } else if (sType == OpenTK.Graphics.OpenGL.ShaderType.VertexShader) { Logger.LogInfoLinePart("Vertex shader ", System.ConsoleColor.Gray); } Logger.LogInfoLinePart(shaderName, System.ConsoleColor.Cyan); Logger.LogInfoLineEnd(); AddIncludesAndDefines(ref shaderSource, ref shaderSources); Shader newShader = new Shader(shaderName, sType, shaderSource); allShaders.Add(newShader); } }
private int CreateShader(string shaderSource, ShaderType type) { int shaderHandle = GL.CreateShader(type); GL.ShaderSource(shaderHandle, shaderSource); GL.CompileShader(shaderHandle); Console.WriteLine(GL.GetShaderInfoLog(shaderHandle)); return shaderHandle; }