Esempio n. 1
0
        /// <summary>
        /// The indexes in which order the rendering command renders vertexes.
        /// </summary>
        /// <param name="bufferId">用glGenBuffers()得到的VBO的Id。<para>Id got from glGenBuffers();</para></param>
        /// <param name="elementType">type in glDrawElements(uint mode, int count, uint type, IntPtr indices);</param>
        /// <param name="byteLength">此VBO中的数据在内存中占用多少个字节?<para>How many bytes in this buffer</para></param>
        internal IndexBuffer(uint bufferId, IndexBufferElementType elementType, int byteLength)
            : base(bufferId, byteLength / elementType.GetSize(), byteLength)
        {
            this.Target = BufferTarget.ElementArrayBuffer;

            this.ElementType = elementType;
        }
        /// <summary>
        /// Creates a <see cref="IndexBuffer"/> object directly in server side(GPU) without initializing its value.
        /// </summary>
        /// <param name="type"></param>
        /// <param name="length">How many indexes are there?(How many uint/ushort/bytes?)</param>
        /// <param name="usage"></param>
        /// <returns></returns>
        public static IndexBuffer Create(IndexBufferElementType type, int length, BufferUsage usage)
        {
            int byteLength = type.GetSize() * length;

            uint[] buffers = new uint[1];
            {
                glGenBuffers(1, buffers);
                const uint target = GL.GL_ELEMENT_ARRAY_BUFFER;
                glBindBuffer(target, buffers[0]);
                glBufferData(target, byteLength, IntPtr.Zero, (uint)usage);
                glBindBuffer(target, 0);
            }

            var buffer = new IndexBuffer(buffers[0], type, byteLength);

            return(buffer);
        }
Esempio n. 3
0
        /// <summary>
        /// Creates a <see cref="OneIndexBuffer"/> object directly in server side(GPU) without initializing its value.
        /// </summary>
        /// <param name="array"></param>
        /// <param name="type"></param>
        /// <param name="mode"></param>
        /// <param name="usage"></param>
        /// <returns></returns>
        public static OneIndexBuffer GenIndexBuffer <T>(this T[] array, IndexBufferElementType type, DrawMode mode, BufferUsage usage) where T : struct
        {
            GCHandle pinned = GCHandle.Alloc(array, GCHandleType.Pinned);
            IntPtr   header = pinned.AddrOfPinnedObject();
            // same result with: IntPtr header = Marshal.UnsafeAddrOfPinnedArrayElement(array, 0);
            UnmanagedArrayBase unmanagedArray = new TempUnmanagedArray <T>(header, array.Length);// It's not neecessary to call Dispose() for this unmanaged array.
            int byteLength = unmanagedArray.ByteLength;

            uint[] buffers = new uint[1];
            {
                glGenBuffers(1, buffers);
                const uint target = GL.GL_ELEMENT_ARRAY_BUFFER;
                glBindBuffer(target, buffers[0]);
                glBufferData(target, byteLength, unmanagedArray.Header, (uint)usage);
                glBindBuffer(target, 0);
            }
            pinned.Free();

            var buffer = new OneIndexBuffer(
                buffers[0], mode, type, byteLength / type.GetSize(), byteLength);

            return(buffer);
        }