private void FlushVertexLayouts() { uint totalSlotsBound = 0; VertexLayoutDescription[] layouts = _graphicsPipeline.GraphicsDescription.ShaderSet.VertexLayouts; for (int i = 0; i < layouts.Length; i++) { VertexLayoutDescription input = layouts[i]; OpenGLBuffer vb = _vertexBuffers[i]; glBindBuffer(BufferTarget.ArrayBuffer, vb.Buffer); uint offset = 0; for (uint slot = 0; slot < input.Elements.Length; slot++) { ref VertexElementDescription element = ref input.Elements[slot]; // Large structure -- use by reference. uint actualSlot = totalSlotsBound + slot; if (actualSlot >= _vertexAttributesBound) { glEnableVertexAttribArray(actualSlot); } VertexAttribPointerType type = OpenGLFormats.VdToGLVertexAttribPointerType( element.Format, out bool normalized); glVertexAttribPointer( actualSlot, FormatHelpers.GetElementCount(element.Format), type, normalized, (uint)_graphicsPipeline.VertexStrides[i], (void *)offset); uint stepRate = input.InstanceStepRate; if (_vertexAttribDivisors[actualSlot] != stepRate) { glVertexAttribDivisor(actualSlot, stepRate); _vertexAttribDivisors[actualSlot] = stepRate; } offset += FormatHelpers.GetSizeInBytes(element.Format); } totalSlotsBound += (uint)input.Elements.Length; }
public OpenGLIndexBuffer(ref IndexBufferDescription description) : base(description.SizeInBytes, description.Dynamic, BufferTarget.ElementArrayBuffer) { Format = description.Format; DrawElementsType = OpenGLFormats.VdToGLDrawElementsType(description.Format); }