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