public ShaderProgram(string nameParam, params Shader[] shaders) { handle = GL.CreateProgram(); foreach (var shader in shaders) { GL.AttachShader(handle, shader.Handle); } GL.LinkProgram(handle); // Check link errors int successValue = 0; GL.GetProgram(handle, GetProgramParameterName.LinkStatus, out successValue); if (successValue == 0) { Logger.LogError(Logger.ErrorState.Limited, "Shader link failed: " + GL.GetProgramInfoLog(handle)); } programName = nameParam; Logger.LogInfoLinePart("Creating Shader Program: ", ConsoleColor.Gray); Logger.LogInfoLinePart(programName, ConsoleColor.Cyan); Logger.LogInfoLineEnd(); // Load Uniforms /////////////////////////////////// int uniformAmount = -1; GL.GetProgram(handle, GetProgramParameterName.ActiveUniforms, out uniformAmount); Error.checkGLError("Shader()"); ShaderUniformManager uniManager = ShaderUniformManager.GetSingleton(); Logger.LogInfo("Program linked."); uniforms = new List <ShaderUniform>(uniformAmount); int maxShaderNameSize = 100; StringBuilder shaderName = new StringBuilder(maxShaderNameSize); int writtenLength; int uniformSize; ActiveUniformType type; Logger.LogInfo("Uniforms (" + uniformAmount + ") >>>"); for (int i = 0; i < uniformAmount; i++) { GL.GetActiveUniform(this.handle, i, maxShaderNameSize, out writtenLength, out uniformSize, out type, shaderName); string uniformName = shaderName.ToString(); ShaderSizeInfo info = uniManager.GetTypeSizeInfo(type); ShaderUniform uniform = uniManager.CreateShaderUniform(uniformName, type, GetUniformLocation(this.handle, uniformName)); Logger.LogInfoLinePart(" " + i, ConsoleColor.White); Logger.LogInfoLinePart("\t" + uniManager.GetDataTypeString(uniManager.UniformTypeToDataType(type)), ConsoleColor.Cyan); Logger.LogInfoLinePart("\t" + uniformName + " (" + info.sizeElements + ")", ConsoleColor.White); if (uniform.IsValid()) { Logger.LogInfoLinePart("\t\t [", ConsoleColor.Gray); Logger.LogInfoLinePart("OK", ConsoleColor.Green); Logger.LogInfoLinePart("]", ConsoleColor.Gray); uniforms.Add(uniform); } Logger.LogInfoLineEnd(); } int attributeAmount = -1; GL.GetProgram(handle, GetProgramParameterName.ActiveAttributes, out attributeAmount); ActiveAttribType attribType; int attrSize = -1; Logger.LogInfo("Attributes (" + attributeAmount + ") >>>"); attributes = new List <ShaderAttribute>(attributeAmount); for (int i = 0; i < attributeAmount; i++) { GL.GetActiveAttrib(this.handle, i, maxShaderNameSize, out writtenLength, out attrSize, out attribType, shaderName); string attribName = shaderName.ToString(); int location = GetAttributeLocation(handle, attribName); ShaderSizeInfo info = uniManager.GetTypeSizeInfo(attribType); ShaderAttribute attribute = uniManager.CreateShaderAttribute(attribName, attribType, GetAttributeLocation(this.handle, attribName), info.sizeElements); Logger.LogInfoLinePart(" " + i, ConsoleColor.White); Logger.LogInfoLinePart("\t" + uniManager.GetDataTypeString(uniManager.AttribTypeToDataType(attribType)), ConsoleColor.Cyan); Logger.LogInfoLinePart("\t" + attribName + " (" + info.sizeElements + ")", ConsoleColor.White); Logger.LogInfoLinePart("\t " + location, ConsoleColor.Red); if (attribute.IsValid()) { Logger.LogInfoLinePart("\t\t [", ConsoleColor.Gray); Logger.LogInfoLinePart("OK", ConsoleColor.Green); Logger.LogInfoLinePart("]", ConsoleColor.Gray); attributes.Add(attribute); } Logger.LogInfoLineEnd(); } foreach (var shader in shaders) { GL.DeleteShader(shader.Handle); } }
public ShaderUniform CreateShaderUniform(string nameString, ActiveUniformType type, int location) { ShaderUniform returnValue; if (supportedUniforms.ContainsKey(nameString)) { ShaderUniform supported = supportedUniforms[nameString]; ShaderDataType uniformType = UniformTypeToDataType(type); if (supported.dataType == uniformType) { /* * Logger.LogInfoLinePart("Created supported uniform :", System.ConsoleColor.Gray); * Logger.LogInfoLinePart(" (", System.ConsoleColor.Gray); * Logger.LogInfoLinePart("" + location, System.ConsoleColor.Red); * Logger.LogInfoLinePart(")", System.ConsoleColor.Gray); * Logger.LogInfoLinePart(" " + GetDataTypeString(uniformType), System.ConsoleColor.Cyan); * Logger.LogInfoLinePart(" " + nameString, System.ConsoleColor.Gray); * Logger.LogInfoLineEnd(); */ returnValue = new ShaderUniform(supported.name, supported.dataType, location); } else { Logger.LogError(Logger.ErrorState.Critical, "Shader data type mismatch with supported uniform type: " + " Expected: " + GetDataTypeString(supported.dataType) + " Got: " + GetDataTypeString(uniformType)); returnValue = new ShaderUniform(ShaderUniformName.InvalidUniformName, ShaderDataType.InvalidType); } } else if (nameString.StartsWith("uc")) { // Custom attribute is ok returnValue = new ShaderUniform(ShaderUniformName.CustomUniform, UniformTypeToDataType(type), location); } else if (nameString.Contains(".")) { // Array attribute Array[i].variable string[] parts = nameString.Split('.'); string[] arrayAndIndex = parts[0].Split('['); string arrayUniform = arrayAndIndex[0]; string index = arrayAndIndex[1].Split(']')[0]; string variableUniform = parts[1]; if (supportedUniforms.ContainsKey(arrayUniform)) { ShaderUniform supportedArray = supportedUniforms[arrayUniform]; ShaderUniform supported = supportedUniforms[variableUniform]; ShaderDataType uniformType = UniformTypeToDataType(type); if (supported.dataType == uniformType) { int arrayIndex = int.Parse(index); /* * Logger.LogInfoLinePart("Created supported array uniform :", System.ConsoleColor.Gray); * Logger.LogInfoLinePart(" (", System.ConsoleColor.Gray); * Logger.LogInfoLinePart("" + location, System.ConsoleColor.Red); * Logger.LogInfoLinePart(")", System.ConsoleColor.Gray); * Logger.LogInfoLinePart(" " + GetDataTypeString(uniformType), System.ConsoleColor.Cyan); * Logger.LogInfoLinePart(" " + arrayUniform + "[", System.ConsoleColor.Gray); * Logger.LogInfoLinePart(" " + arrayIndex , System.ConsoleColor.Red); * Logger.LogInfoLinePart("].", System.ConsoleColor.Gray); * Logger.LogInfoLinePart(variableUniform, System.ConsoleColor.Gray); * Logger.LogInfoLineEnd(); */ returnValue = new ShaderUniform(supported.name, supported.dataType, location, supportedArray.name, arrayIndex); } else { Logger.LogError(Logger.ErrorState.Critical, "Shader data type mismatch with supported uniform type: " + " Expected: " + GetDataTypeString(supported.dataType) + " Got: " + GetDataTypeString(uniformType)); returnValue = new ShaderUniform(ShaderUniformName.InvalidUniformName, ShaderDataType.InvalidType); } } else { Logger.LogError(Logger.ErrorState.Critical, "Shader uniform name contains '.' but is not supported array: " + nameString); returnValue = new ShaderUniform(ShaderUniformName.InvalidUniformName, ShaderDataType.InvalidType); } } else { Logger.LogError(Logger.ErrorState.Critical, "Unsupported shader uniform: " + nameString + ", of type:" + GetDataTypeString(UniformTypeToDataType(type))); returnValue = new ShaderUniform(ShaderUniformName.InvalidUniformName, ShaderDataType.InvalidType); } return(returnValue); }