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); }
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); } } }
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); } } } }