public ShaderSizeInfo GetTypeSizeInfo(ShaderDataType type) { int bt = MeshData.BytesPerFloat; ShaderSizeInfo result; switch (type) { case ShaderDataType.Float: result = new ShaderSizeInfo(bt, 1); break; case ShaderDataType.Float2: result = new ShaderSizeInfo(bt * 2, 2); break; case ShaderDataType.Float3: result = new ShaderSizeInfo(bt * 3, 3); break; case ShaderDataType.Float4: result = new ShaderSizeInfo(bt * 4, 4); break; case ShaderDataType.Mat4: result = new ShaderSizeInfo(bt * 16, 16); break; default: result = new ShaderSizeInfo(0, 0); break; } return(result); }
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); } }