Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }