コード例 #1
0
        /// <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);
        }
コード例 #2
0
ファイル: UniformBlock.cs プロジェクト: hhxx1314/CSharpGL
        /// <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);
        }