Beispiel #1
0
        public int FindUniform(string name)
        {
            //TODO:
            //Debug.Assert(false);

            foreach (int index in __uniformDic.Keys)
            {
                __uniform_data data = __uniformDic[index];
                if (data.name.Equals(name))
                {
                    return(index);
                }
            }
            int newId = __FindUniform_nextId;

            __FindUniform_nextId++;
            SetUniformBinding(newId, name);
            this.__linkProgram();
            foreach (int index in __uniformDic.Keys)
            {
                if (index == newId)
                {
                    __uniform_data data = __uniformDic[index];
                    data.location = GL.GetUniformLocation(__programObject, data.name);
                    Debug.WriteLine(">>>FindUniform:uniform['" + data.name + "':" + index + "].location == " + data.location);
                    return(newId);
                }
            }
            return(-1);
        }
Beispiel #2
0
        public void SetUniformBinding(int index, string name)
        {
            __uniformDic[index] = new __uniform_data(name, -1);

            if (__programObject != 0)
            {
                if ((GraphicsContext.__isUsedProgram.ContainsKey(__programObject) &&
                     GraphicsContext.__isUsedProgram[__programObject]) || __begin_GetUniformName)
                {
                    __uniform_data data = __uniformDic[index];
                    data.location = GL.GetUniformLocation(__programObject, data.name);
                    Debug.WriteLine("uniform['" + data.name + "':" + index + "].location == " + data.location);
                }
            }
        }
Beispiel #3
0
        public void __linkProgram()
        {
            if (__filename_vcg == null || __filename_fcg == null || __isLinked)
            {
                return;
            }
            __isLinked = true;
            string vShaderStr = __ReadString(__filename_vcg);
            string fShaderStr = __ReadString(__filename_fcg);
            int    vertexShader, fragmentShader;

            // Load the vertex/fragment shaders
            Debug.WriteLine("=============begin load shader : " + __filename_vcg + ", " + __filename_fcg);
            vertexShader   = __LoadShader(ShaderType.VertexShader, vShaderStr);
            fragmentShader = __LoadShader(ShaderType.FragmentShader, fShaderStr);
            Debug.WriteLine("=============end load shader : " + __filename_vcg + ", " + __filename_fcg);

            // Create shader program.
            __programObject = GL.CreateProgram();

            // Attach vertex shader to program.
            GL.AttachShader(__programObject, vertexShader);
            GL.AttachShader(__programObject, fragmentShader);

            // Bind vPosition to attribute 0
//              GL.BindAttribLocation ( __programObject, 0, "a_Position");
//              GL.BindAttribLocation ( __programObject, 1, "a_Color0");


            foreach (int key in __attribDic.Keys)
            {
                GL.BindAttribLocation(__programObject, key, __attribDic[key]);
            }



            //https://github.com/infinitespace-studios/Blog/blob/master/Etc1ContentPipeline/Etc1Alpha.Test/GLSupport.cs

            // Link the program
            GL.LinkProgram(__programObject);



            int linked = 0;

            GL.GetProgram(__programObject, GetProgramParameterName.LinkStatus, out linked);

            // Link program.
            if (linked == 0)
            {
                System.Diagnostics.Debug.WriteLine("Failed to link program: {0:x}", __programObject);

                if (vertexShader != 0)
                {
                    GL.DeleteShader(vertexShader);
                }

                if (fragmentShader != 0)
                {
                    GL.DeleteShader(fragmentShader);
                }

                if (__programObject != 0)
                {
                    GL.DeleteProgram(__programObject);
                    __programObject = 0;
                }
            }
            else
            {
                // Release vertex and fragment shaders.
                if (vertexShader != 0)
                {
                    GL.DetachShader(__programObject, vertexShader);
                    GL.DeleteShader(vertexShader);
                }

                if (fragmentShader != 0)
                {
                    GL.DetachShader(__programObject, fragmentShader);
                    GL.DeleteShader(fragmentShader);
                }
            }


            //http://blog.csdn.net/hjimce/article/details/51475644


            {
                Debug.WriteLine(">>>>>compiled summary: " + __filename_vcg + ", " + __filename_fcg);
                foreach (string v in __attribDic.Values)
                {
                    int location = GL.GetAttribLocation(__programObject, v);
                    Debug.WriteLine(">attrib['" + v + "'].location == " + location);
                }
            }
            {
                foreach (int index in __uniformDic.Keys)
                {
                    __uniform_data data = __uniformDic[index];
                    data.location = GL.GetUniformLocation(__programObject, data.name);
                    Debug.WriteLine(">uniform['" + data.name + "':" + index + "].location == " + data.location);
                }
                //FIXME:tex
                for (int i = 0; i < 32; ++i)
                {
                    string name     = "Texture" + i;
                    int    location = GL.GetUniformLocation(__programObject, name);
                    if (location >= 0)
                    {
                        Debug.WriteLine(">__programObject=" + __programObject + ", texture.uniform['" + name + "'].location == " + location);
                    }
                }
            }
        }