/// <summary> /// Initialize and setup uniform block's value. /// </summary> /// <param name="program"></param> /// <returns></returns> private UniformBuffer Initialize(ShaderProgram program) { if (glGetUniformBlockIndex == null) { glGetUniformBlockIndex = OpenGL.GetDelegateFor <OpenGL.glGetUniformBlockIndex>(); glGetActiveUniformBlockiv = OpenGL.GetDelegateFor <OpenGL.glGetActiveUniformBlockiv>(); } uint uboIndex = glGetUniformBlockIndex(program.ProgramId, this.VarName); var uboSize = new uint[1]; glGetActiveUniformBlockiv(program.ProgramId, uboIndex, OpenGL.GL_UNIFORM_BLOCK_DATA_SIZE, uboSize); byte[] bytes = this.value.ToBytes(); UniformBuffer result = bytes.GenUniformBuffer(BufferUsage.StaticDraw); // another way to do this: //UniformBuffer result = UniformBuffer.Create(typeof(byte), bytes.Length, BufferUsage.StaticDraw); //unsafe //{ // var array = (byte*)result.MapBuffer(MapBufferAccess.WriteOnly); // for (int i = 0; i < bytes.Length; i++) // { // array[i] = bytes[i]; // } // result.UnmapBuffer(); //} //glBindBufferBase(OpenGL.GL_UNIFORM_BUFFER, uboIndex, result.BufferId); //glBindBufferBase(OpenGL.GL_UNIFORM_BUFFER, 0, result.BufferId); //glUniformBlockBinding(program.ProgramId, uboIndex, 0); result.Binding(program, uboIndex, 0); result.Unbind(); return(result); }
/// <summary> /// Initialize and setup uniform block's value. /// </summary> /// <param name="program"></param> /// <returns></returns> private UniformBufferPtr Initialize(ShaderProgram program) { if (glGetUniformBlockIndex == null) { glGetUniformBlockIndex = OpenGL.GetDelegateFor <OpenGL.glGetUniformBlockIndex>(); glGetActiveUniformBlockiv = OpenGL.GetDelegateFor <OpenGL.glGetActiveUniformBlockiv>(); } uint uboIndex = glGetUniformBlockIndex(program.ProgramId, this.VarName); var uboSize = new uint[1]; glGetActiveUniformBlockiv(program.ProgramId, uboIndex, OpenGL.GL_UNIFORM_BLOCK_DATA_SIZE, uboSize); UniformBufferPtr result = null; using (var buffer = new UniformBuffer <byte>(BufferUsage.StaticDraw, noDataCopyed: false)) { byte[] bytes = this.value.ToBytes(); buffer.Create(bytes.Length); unsafe { var array = (byte *)buffer.Header.ToPointer(); for (int i = 0; i < bytes.Length; i++) { array[i] = bytes[i]; } } result = buffer.GetBufferPtr() as UniformBufferPtr; } //glBindBufferBase(OpenGL.GL_UNIFORM_BUFFER, uboIndex, result.BufferId); //glBindBufferBase(OpenGL.GL_UNIFORM_BUFFER, 0, result.BufferId); //glUniformBlockBinding(program.ProgramId, uboIndex, 0); result.Binding(program, uboIndex, 0); result.Unbind(); return(result); }