internal VertexDeclarationAttributeInfo GetAttributeInfo(Shader shader, int programHash) { VertexDeclarationAttributeInfo attrInfo; if (_shaderAttributeInfo.TryGetValue(programHash, out attrInfo)) { return(attrInfo); } // Get the vertex attribute info and cache it attrInfo = new VertexDeclarationAttributeInfo(GraphicsDevice.MaxVertexAttributes); foreach (var ve in InternalVertexElements) { var attributeLocation = shader.GetAttribLocation(ve.VertexElementUsage, ve.UsageIndex); // XNA appears to ignore usages it can't find a match for, so we will do the same if (attributeLocation < 0) { continue; } attrInfo.Elements.Add(new VertexDeclarationAttributeInfo.Element { Offset = ve.Offset, AttributeLocation = attributeLocation, NumberOfElements = ve.VertexElementFormat.OpenGLNumberOfElements(), VertexAttribPointerType = ve.VertexElementFormat.OpenGLVertexAttribPointerType(), Normalized = ve.OpenGLVertexAttribNormalized(), }); attrInfo.EnabledAttributes[attributeLocation] = true; } _shaderAttributeInfo.Add(programHash, attrInfo); return(attrInfo); }
internal void Apply(Shader shader, IntPtr offset, int divisor = 0) { VertexDeclarationAttributeInfo attrInfo; int shaderHash = shader.GetHashCode(); if (!shaderAttributeInfo.TryGetValue(shaderHash, out attrInfo)) { // Get the vertex attribute info and cache it attrInfo = new VertexDeclarationAttributeInfo(OpenGLDevice.Instance.MaxVertexAttributes); foreach (VertexElement ve in elements) { int attributeLocation = shader.GetAttribLocation(ve.VertexElementUsage, ve.UsageIndex); // XNA appears to ignore usages it can't find a match for, so we will do the same if (attributeLocation >= 0) { attrInfo.Elements.Add(new VertexDeclarationAttributeInfo.Element() { Offset = ve.Offset, AttributeLocation = attributeLocation, NumberOfElements = OpenGLNumberOfElements(ve.VertexElementFormat), VertexAttribPointerType = OpenGLVertexAttribPointerType(ve.VertexElementFormat), Normalized = OpenGLVertexAttribNormalized(ve), }); attrInfo.EnabledAttributes[attributeLocation] = true; } } shaderAttributeInfo.Add(shaderHash, attrInfo); } // Apply the vertex attribute info foreach (VertexDeclarationAttributeInfo.Element element in attrInfo.Elements) { OpenGLDevice.Instance.AttributeEnabled[element.AttributeLocation] = true; OpenGLDevice.Instance.Attributes[element.AttributeLocation].Divisor.Set(divisor); OpenGLDevice.Instance.VertexAttribPointer( element.AttributeLocation, element.NumberOfElements, element.VertexAttribPointerType, element.Normalized, VertexStride, (IntPtr)(offset.ToInt64() + element.Offset) ); } }
internal void Apply(Shader shader, IntPtr offset) { VertexDeclarationAttributeInfo attrInfo; int shaderHash = shader.GetHashCode(); if (!shaderAttributeInfo.TryGetValue(shaderHash, out attrInfo)) { // Get the vertex attribute info and cache it attrInfo = new VertexDeclarationAttributeInfo(GraphicsDevice.MaxVertexAttributes); foreach (var ve in _elements) { var attributeLocation = shader.GetAttribLocation(ve.VertexElementUsage, ve.UsageIndex); // XNA appears to ignore usages it can't find a match for, so we will do the same if (attributeLocation >= 0) { attrInfo.Elements.Add(new VertexDeclarationAttributeInfo.Element() { Offset = ve.Offset, AttributeLocation = attributeLocation, NumberOfElements = ve.VertexElementFormat.OpenGLNumberOfElements(), VertexAttribPointerType = ve.VertexElementFormat.OpenGLVertexAttribPointerType(), Normalized = ve.OpenGLVertexAttribNormalized(), }); attrInfo.EnabledAttributes[attributeLocation] = true; } } shaderAttributeInfo.Add(shaderHash, attrInfo); } // Apply the vertex attribute info foreach (var element in attrInfo.Elements) { GL.VertexAttribPointer(element.AttributeLocation, element.NumberOfElements, element.VertexAttribPointerType, element.Normalized, this.VertexStride, (IntPtr)(offset.ToInt64() + element.Offset)); GraphicsExtensions.CheckGLError(); } GraphicsDevice.SetVertexAttributeArray(attrInfo.EnabledAttributes); }
/// <summary> /// 链接顶点属性 /// (顶点数据的哪一部分对应着色器的哪一个顶点属性) /// </summary> /// <param name="shader"></param> /// <param name="offset"></param> /// <param name="programHash"></param> internal void Apply(Shader shader, IntPtr offset, int programHash) { VertexDeclarationAttributeInfo attrInfo; if (!shaderAttributeInfo.TryGetValue(programHash, out attrInfo)) { // Get the vertex attribute info and cache it attrInfo = new VertexDeclarationAttributeInfo(GraphicsDevice.MaxVertexAttributes); foreach (var ve in InternalVertexElements) { var attributeLocation = shader.GetAttribLocation(ve.VertexElementUsage, ve.UsageIndex); if (attributeLocation >= 0) { attrInfo.Elements.Add(new VertexDeclarationAttributeInfo.Element { Offset = ve.Offset, AttributeLocation = attributeLocation, NumberOfElements = ve.VertexElementFormat.OpenGLNumberOfElements(), VertexAttribPointerT = ve.VertexElementFormat.OpenGLVertexAttribPointerT(), Normalized = ve.OpenGLVertexAttribNormalized(), }); attrInfo.EnabledAttributes[attributeLocation] = true; } } shaderAttributeInfo.Add(programHash, attrInfo); } //Apply the vertex attribute info foreach (var element in attrInfo.Elements) { GL.VertexAttribPointer(element.AttributeLocation, element.NumberOfElements, element.VertexAttribPointerT, element.Normalized, this.VertexStride, (IntPtr)(offset.ToInt64() + element.Offset)); GraphicsExtensions.CheckGLError(); } GraphicsDevice.SetVertexAttributeArray(attrInfo.EnabledAttributes); }