public OpenGLVertexInputElement(VertexInputElement genericElement, int offset) { SizeInBytes = genericElement.SizeInBytes; ElementCount = FormatHelpers.GetElementCount(genericElement.ElementFormat); Type = GetGenericFormatType(genericElement.ElementFormat); Offset = offset; Normalized = genericElement.SemanticType == VertexSemanticType.Color && genericElement.ElementFormat == VertexElementFormat.Byte4; InstanceStepRate = genericElement.InstanceStepRate; }
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; }